【问题标题】:How to bind typed DataTable to DataGridView如何将类型化的 DataTable 绑定到 DataGridView
【发布时间】:2011-02-23 10:01:21
【问题描述】:

使用下面的代码,我试图在不依赖实际数据库列名的知识的情况下自定义 DGV。但它不起作用。我能知道正确的方法是什么吗?谢谢。

public class MyDataTable : DataTable { ... }

public class MyDataRow : DataRow 
{
    public FirstProperty { get; set; }
    public SecondProperty { get; set; }
    public ThirdProperty { get; set; }
}

void LoadDataGridView()
{
    DataGridViewTextColumn colFirst = new DataGridViewTextColumn();

    dgv.AutoGenerateColumns = false;
    ...
    colFirst.HeaderText = "First Property";
    colFirst.DataPropertyName = "FirstProperty"; // doesnt work ?
    ...
    ...
    dgv.Columns.AddRange = { ... };
    dgv.DataSource = new BindingSource(mydatatable);
}

【问题讨论】:

  • 为什么不直接将 DGV 绑定到数据表并重命名列标题?
  • @Kamyar 如前所述,目标是从 UI 实现中隐藏实际的数据库列名称。
  • 如果你在到处乱扔DataTable,IMO 你已经混合了数据和 UI。您需要某种基于对象的域模型来避免这种情况。
  • @Marc Gravell 好.. 我同意你的观点,但我想看看 .NET 是否有任何我可以最小化它的东西。
  • 没有。没有用您自己的类型对象包装每一行;在这种情况下它不会。通常的工具库完全由 ITypedList 解除。

标签: c# datagridview datatable datarow


【解决方案1】:

DataTable 实现(间接*)ITypedList,它始终优先于反射类型模型。因此,您添加的任何属性在很大程度上与数据绑定目的无关,因为属性定义在任何时候都不涉及反射,而是查看DataTable 上定义的列。

或者不那么冗长:那行不通,也行不通。

*= 通过IListSource 返回DefaultView,这是一个实现ITypedListDataView

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 2011-09-17
    相关资源
    最近更新 更多