العمل مع DataGridViewRow.databoundItem - تحويل إلى كائن لا يمكن تعداده؟
-
30-09-2019 - |
سؤال
لدي datagridview
myGridView.DataSource = GetSomeData()
// method called
public IQueryable GetSomeData()
{
var source = from r in records
select r;
return source; // made correction from 'r' to 'source'
}
GetSomeData()
يملأ DataGridView كما هو متوقع. سيقوم المستخدم بتحديد صف لتحريره بعد ذلك يقوم بتمرير بيانات الصف إلى نموذج. منذ DataGridViewRow.DataBoundItem
هو نوع مجهول ، كيف يمكنني المرور DataBoundItem
?
كنت أتوقع أن يكون DataboundItem الخاص بي سيكون غير صحيح. فيما يلي المعلومات من The Debugger على خاصية DataboundItem:
databoundItem {customerId = "3133" ، last_name = "smith" ، first_name = "John" ، accountNumber = "JS3133" ، Activeyn = true} <نوع مجهول>
بمجرد نقل البيانات إلى النموذج الجديد ، أود أن أفعل شيئًا مثل:
txtFName.Text = SomeEnumeratedObject["First_Name"];
txtLName.Text = SomeEnumeratedObject["Last_Name"];
أي أفكار حول كيف يمكنني القيام بذلك؟ سيكون من الأفضل ، IMO ، إذا كانت الضوابط على النموذج الجديد قد تكون ملزمة SomeEnumeratedObject
.
هل من الممكن الاستعلام عن DataBoundItem
مع LINQ؟
يحرر:
الطريقة المتغيرة:
public DataView GetSomeData()
{
var source = from r in records
select r;
DataTable table = ToDataTable(myContext, source);
return new DataView(table);
}
انظر الحل الكامل هنا.
المحلول
يمكنك تمريرها على أنها dynamic
والوصول إلى الخصائص بهذه الطريقة:
public void Test(dynamic item)
{
MessageBox.Show(string.Format("{0} : {1}", item.First_Name, item.Last_Name));
textBox1.DataBindings.Add("Text", _item, "First_Name");
textBox2.DataBindings.Add("Text", _item, "Last_Name");
}
شيء واحد يجب مراعاته هو أن الخصائص على أنواع مجهولة تتم قراءة فقط ، لذلك لن يتمكن المستخدمون من تعديل القيم بهذه الطريقة. من SPANC LANGY SPER:
أعضاء النوع المجهول هو سلسلة من الخصائص القراءة فقط المستنتج من مُهيئ الكائن المجهول المستخدم لإنشاء مثيل من النوع.
يجب أن تفكر في إعلان نوع لهذا بدلاً من استخدام نوع مجهول. وبهذه الطريقة ، ستحصل أيضًا على فائدة Intellisense وتكون قادرًا على إعادة تسمية/إعادة صياغة خصائصك دون أي مشاكل.
نصائح أخرى
ما نوع الكائنات في السجلات؟ يجب أن تكون قادرًا على إلقاء DataGridViewRow.databoundItem إلى أي نوع من سجلات الكائنات.
SALL SEALH RECORDS عبارة عن قائمة بكائنات العملاء. يجب أن تكون قادرًا على الذهاب:
txtFName.Text = ((Customer)DataGridViewRow.DataBoundItem).First_Name;
txtLName.Text = ((Customer)DataGridViewRow.DataBoundItem).Last_Name;
إذا لم يكن ذلك ممكنًا ، فأعتقد أنه سيتعين عليك استخدام التأمل:
Type type = DataGridViewRow.DataBoundItem.GetType();
String firstName = (String)type.GetProperty("First_Name")
.GetValue(DataGridViewRow.DataBoundItem, null);
كان لدى كل من KeveV22 و Adrift الفكرة الصحيحة: إنشاء فئة لعقد البيانات. نظرًا لأنني أتمكن من تحويل مجموعة نتائج iqueryable إلى datatable ، فمن المنطقي فقط القيام بذلك:
public DataView GetSomeData()
{
var source = from r in records
select r;
DataTable table = ToDataTable(myContext, source);
return new DataView(table);
}
حاليا:
myDGView.DataSource = GetSomeData();
وعندما يتم تحديد صف DataGrid ، يمكنك إلقاء DataBoundItem
إلى DataRow
.
لمعلوماتك - لتحويل مجموعة نتائج iqueryable إلى datatable:
public DataTable ToDataTable(DataContext context, IQueryable source)
{
DataTable table = new DataTable();
{
adapter.SelectCommand = context.GetCommand(source);
sqlCommand.Connection.Open();
adapter.FillSchema(table, SchemaType.Source);
adapter.Fill(table);
}
return table;
}