Working with DataGridViewRow.DataBoundItem - transform to Enumerable Object?

IAbstract picture IAbstract · Nov 10, 2010 · Viewed 8.4k times · Source

I have a DataGridView with

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() fills the DataGridView as expected. The user will select a row to edit which then passes the row data to a form. Since the DataGridViewRow.DataBoundItem is an anonymous type, how can I pass DataBoundItem?

I half expected that my DataBoundItem would be IQueryable - incorrect. Here is the info from the debugger on the DataBoundItem property:

DataBoundItem { CustomerID = "3133", Last_Name = "Smith", First_Name = "John", AccountNumber = "JS3133", ActiveYN = True } < Anonymous Type >

Once the data is passed to the new form, I would like to do something like:

txtFName.Text = SomeEnumeratedObject["First_Name"];
txtLName.Text = SomeEnumeratedObject["Last_Name"];

Any ideas on how I can do this? It would be even better, IMO, if the controls on the new form could some how be bound to SomeEnumeratedObject.

Would it possible to query the DataBoundItem with LINQ?

Edit:

Changed method:

public DataView GetSomeData()
{
    var source = from r in records
                 select r;

    DataTable table = ToDataTable(myContext, source);
    return new DataView(table);
}

See complete solution here.

Answer

kevev22 picture kevev22 · Nov 10, 2010

What type of objects are in records? You should be able to cast DataGridViewRow.DataBoundItem to whatever type of object records holds.

Say records is a list of Customer objects. You should be able to go:

txtFName.Text = ((Customer)DataGridViewRow.DataBoundItem).First_Name;
txtLName.Text = ((Customer)DataGridViewRow.DataBoundItem).Last_Name; 

If that isn't possible, then I think you will have to use reflection:

Type type = DataGridViewRow.DataBoundItem.GetType();  
String firstName = (String)type.GetProperty("First_Name")
                        .GetValue(DataGridViewRow.DataBoundItem, null);