العمل مع DataGridViewRow.databoundItem - تحويل إلى كائن لا يمكن تعداده؟

StackOverflow https://stackoverflow.com/questions/4149040

سؤال

لدي 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top