2

我有一个 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"];

关于如何做到这一点的任何想法?IMO,如果新表单上的控件可以绑定到SomeEnumeratedObject.

可以DataBoundItem用 LINQ 查询吗?

编辑:

改变方法:

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

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

在此处查看完整的解决方案。

4

3 回答 3

1

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

说记录是客户对象的列表。你应该可以去:

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);
于 2010-11-10T21:17:14.257 回答
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# 语言规范:

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

您应该考虑为此声明一个类型,而不是使用匿名类型。这样,您还将获得智能感知的好处,并且能够毫无问题地重命名/重构您的属性。

于 2010-11-10T21:44:40.180 回答
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();

And, when a datagrid row is selected, you can cast the DataBoundItemto 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;
}
于 2010-11-11T00:55:34.743 回答