2012-07-16 36 views
1

当我打开我的表单时,我将一堆行添加到绑定到DataGridView的DataSet。后来,当我枚举DataGridView中的行时,我希望能够访问用于填充DataSet但未存储在DataSet中的一些数据。如何将元数据分配给DataSet/DataGridView对中的一行?

事情是这样的:

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的行的最佳方式是什么?

回答

1

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

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

Tag属性可以存储任何要与 关联的对象。此属性通常用于存储识别信息,例如字符串名称,唯一标识符(例如, guid)或数据库中数据带数据的索引。我会考虑


一种替代方法是在底层对象使用一个BindingList<T>定制的支持对象为DataSource而非DataSet并存储元数据。然后您可以使用DataGridViewRowDataBoundItem属性访问每个对象。

我会稍微倾向于这种方式,因为它保持数据和用户界面更加分离,并且意味着即使只有后备对象时也可以获取元数据,但是我怀疑是否存在具体的差异的性能或内存使用情况。

+0

由于我已经有了一个DataSet绑定到视图,我想我宁愿坚持。另一个问题是,我不确定在技术上如何访问带有DataSet的'Tag'(即我的示例中的GetDataGridViewRow()实际上做了什么?)。我需要使用刚添加的项目在DGV上进行查找,还是有更简单的方法? – ladenedge 2012-07-16 19:35:48

+0

对不起,设法忽略了这部分问题,认为你已经解决了这个问题。是的,你需要做这样的查找 - 这可能最终会变得缓慢而脆弱,所以我建议用更多的自定义对象路由。你从GetData()返回的类型是什么? – 2012-07-16 19:57:40

+0

这只是一个自定义的POCO。我同意lookup似乎kludgey,所以我会给'BindingList '一枪。 – ladenedge 2012-07-16 20:04:10

相关问题