2012-07-16 59 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

相關問題