我有一个 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.

是否可以查询 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");
}

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

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

您应该考虑为此声明一个类型,而不是使用匿名类型。这样,您还可以受益于智能感知,并能够毫无问题地重命名/重构您的属性。

其他提示

记录中有哪种类型的对象?您应该能够将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);

Kevev22和Adrift都有一个正确的想法:创建一个持有数据的类。由于我可以将可视性结果集转换为数据表,因此这样做才有意义:

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 DataBoundItemDataRow.

仅供参考 - 将可视化结果集转换为数据表:

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