使用DataGridViewRow.DataBoundItem - 转换为可枚举对象?

时间:2010-11-10 21:01:51

标签: c# linq .net-3.5 datagridview databound

我有一个带

的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是IQueryable - 不正确。以下是DataBoundItem属性上调试器的信息:

  

DataBoundItem {CustomerID =“3133”,   Last_Name =“Smith”,First_Name =   “John”,AccountNumber =“JS3133”,   ActiveYN = True}<匿名类型>

将数据传递给新表单后,我想做类似的事情:

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

关于我如何做到这一点的任何想法?如果新表格上的控件可以与SomeEnumeratedObject绑定,那将会更好,IMO。

是否可以使用LINQ查询DataBoundItem

编辑:

更改方法:

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

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

请参阅完整的解决方案here

3 个答案:

答案 0 :(得分:1)

记录中有哪些类型的对象?您应该能够将DataGridViewRow.DataBoundItem强制转换为任何类型的对象记录。

Say records是Customer对象的列表。你应该可以去:

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);

答案 1 :(得分:1)

您可以将其作为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");
}

要考虑的一件事是匿名类型的属性是只读的,因此您的用户将无法以这种方式编辑值。来自C#语言规范:

  

匿名类型的成员是从用于创建该类型实例的匿名对象初始值设定项推断出的一系列只读属性。

您应该考虑为此声明一种类型,而不是使用匿名类型。这样你就可以获得intellisense的好处,并能够毫无问题地重命名/重构你的属性。

答案 2 :(得分:0)

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();

并且,当选择数据网格行时,您可以将DataBoundItem转换为DataRow

FYI - 将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;
}