【问题标题】:How can I assign metadata to a row in a DataSet/DataGridView pair?如何将元数据分配给 DataSet/DataGridView 对中的一行?
【发布时间】:2012-07-17 01:27:49
【问题描述】:

当我打开表单时,我将一堆行添加到绑定到 DataGridView 的 DataSet。稍后,当我枚举 DataGridView 中的行时,我希望能够访问一些用于填充 DataSet 但未正确存储在 DataSet 中的数据。

类似这样的:

public void OnStartup()
{
  foreach (var data in GetData())
  {
    var row = MyDataSet.MyTable.AddRow(data.Value);

    // here's the part where I'm not sure what to do.. ideally:
    row.GetDataGridViewRow().Tag = data.Metadata;
  }
}

public void LaterOn()
{
  foreach (var row in MyDataGridView.GetSelected())
  {
     var metadata = (Metadata)row.Tag;  // or something
     ...
  }
}

将一些元数据附加到 DataSet 或 DataGridView 行的最佳方法是什么?

【问题讨论】:

    标签: .net datagridview dataset


    【解决方案1】:

    我会说,这是没有单一“正确”方法的情况之一,只是根据具体情况选择方法。

    像这样使用DataGridView Tag 属性没有任何问题。事实上,这就是它的目的,如 MSDN 所述:

    Tag 属性可以存储您想要关联的任何对象 一个乐队。此属性通常用于存储标识 信息,例如字符串名称、唯一标识符(例如, a Guid),或数据库中乐队数据的索引。


    我会考虑的一种替代方法是使用BindingList<T> 和自定义支持对象作为DataSource 而不是DataSet,并将元数据存储在支持对象中。然后,您可以使用DataGridViewRowDataBoundItem 属性访问每个对象。

    我稍微倾向于这种方式,因为它使数据和 UI 更加分离,这意味着即使您只有支持对象,您也可以获取元数据,但我怀疑在以下方面是否存在任何具体差异性能或内存使用情况。

    【讨论】:

    • 由于我已经有一个绑定到视图的数据集,我想我更愿意坚持下去。不过,另一个问题是我不确定如何在技术上仅使用 DataSet 访问 Tag(即,我的示例中的 GetDataGridViewRow() 实际上是做什么的?)。我是否需要使用我刚刚添加的项目在 DGV 上进行查找,还是有更简单的方法?
    • 啊抱歉,设法忽略了问题的那一部分,以为您已经解决了。是的,您需要进行这样的查找——这最终可能会变得既慢又脆弱,所以我建议更多地使用自定义对象路由。你从 GetData() 返回的类型是什么?
    • 这只是一个自定义的 POCO。我同意查找似乎很麻烦,所以我会给BindingList<T> 一个机会。
    • @ladenedge 另一个想法,再想一想,与使用自定义对象相比,这变得越来越难看,就是将你的数据表复制到网格中,如这个 SO 问题stackoverflow.com/questions/3475830/… 中所示
    • 啊,是的,如果它是自定义 POCO,那么我强烈建议您完全避免使用 DataTables - 与使用 BindingList 相比,我从未发现它们提供任何东西(如果您需要对您进行排序需要实现自己的 SortableBindingList 但这并不难)
    猜你喜欢
    • 2015-01-29
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    相关资源
    最近更新 更多