2010-02-13 44 views
0

我碰到馬克Gravellelegant and witty solution張貼由馬特(標題爲‘C#/winforms: how to best bind a propertygrid and a System.Data.DataRow’)的問題,並已在一個使用相同的解決方案我應用。關於馬克Gravell的RowWrapperDescriptor結合System.Data.Rows到PropertyGrid的

使用一些摘錄從Marc的代碼:

DataTable table = new DataTable(); 
    table.Columns.Add("ID", typeof(int)); 
    table.Columns.Add("Foo", typeof(int)); 
    table.Columns.Add("Bar", typeof(string)); 
    table.Columns.Add("Audit", typeof(DateTime)); 

    table.Rows.Add(1, 14, "abc", DateTime.MinValue); 
    DataRow row = table.Rows.Add(2,13,"def", DateTime.MinValue); 
    table.Rows.Add(3, 24, "ghi", DateTime.MinValue); 

    RowWrapper wrapper = new RowWrapper(row); 
    wrapper.Exclude.Add("ID"); 
    wrapper.Exclude.Add("Bar"); 

我能以某種方式使用一個DataGridView這項工作; DataGridView使用表格作爲源代碼,而DataGridView上的每行點擊將被設置爲propertyGrid1的SelectedObject(使用Marc的RowWrapper),並且它完美地工作。你可能會問爲什麼我這樣做,這意味着同時使用DataGridView和PropertyGrid;事實上,企業要求和狹隘的管理政策。

無論如何,我現在有另一種困境;表格中的一列,比如說「Foo」(順便說一句,它在PropertyGrid中顯示爲字段之一)應該是PropertyGrid中的某種下拉列表。我的意思是,「Foo」應該是包含從另一個DataTable派生的項目列表的組合框。另外,是否有一種方法可以爲每個字段項目添加某種描述?

可以這樣做嗎? Marc Gravell提到了類似於「」請注意,您可以在此區域執行其他操作以使某些屬性不可編輯(IsReadOnly),或者具有不同的標題(DisplayName)或類別(Category) - 通過覆蓋其他成員RowWrapperDescriptor。「作爲他的帖子的結束語,我想知道是否有辦法做到這一點。

任何理論上的建議,非常感謝。非常感謝。

+0

這可能是一個想法退後一步;你試圖達到什麼效果?所以:你有一個'DataTable';你想......? [在這裏填空......]。 –

+0

「做到這一點的方式」完全如上所述;重寫'IsReadOnly'或'DisplayName'等。DataGridView中沒有「category」。對於下拉列表,我懷疑你必須通過手動修改DataGridView屬性(可能手動添加列作爲下拉列)來手動執行該操作。但沒有關於什麼是/不工作的更多信息,很難更具體。 –

回答

0

感謝您的迴應Marc ...

就是這樣;假設我們的業務需求有以下數據表設置:

DataTable table = new DataTable(); 

table.Columns.Add("ID", typeof(int)); 
table.Columns.Add("MedSequence", typeof(int)); 
table.Columns.Add("Prognosis", typeof(string)); 
table.Columns.Add("RBC", typeof(string)); 
table.Columns.Add("WBC", typeof(string)); 
table.Columns.Add("BP Normal", typeof(bool); 
table.Columns.Add("Histology", typeof(string)); 

DataRow row = table.Rows.Add(559,6845,"Progressive decline","54–62pcnt","6.1 million/uL",true,"Haematoxylin"); 

我設置dataGridView1的數據源爲「表」,而在每一個cellcontentclick的datagridview的,propertyGrid1的SelectedObject設定爲DataGridView中「當前」選擇行。從某種意義上說,要求是dataGridView1應該只顯示2列:MedSequence和Prognosis,而DataTable表中的其餘列對用戶是不可見的。

但是,propertyGrid1應顯示錶中的所有列作爲屬性。因此,預期的效果是DataGridView只是用於顯示(MedSequence和Prognosis列)的手段,而其他表值的編輯由propertyGrid1處理。

就像我在我的帖子中說的那樣,使用RowWrapper類,它完美地工作。但是,對於表格列之一「組織學」,propertyGrid1應顯示包含以下列表的可編輯下拉列表:{「蘇木精」,「曙紅」,「甲苯胺藍」,「高碘酸 - 希夫染色劑」 }。從本質上講,管理層正在考慮從數據庫查詢值中填充這個下拉列表(這可能是我們要做的),但基本上,我的問題是讓propertyGrid1中的「組織學」字段成爲下拉列表,下拉列表。由於propertyGrid1正在使用它的從數據表的列派生的字段的包裝器,所以我不知道該怎麼做。

即使我將組織學的DataGridView列更改爲下拉列表,它也不會起作用,因爲就像我所說的那樣,表中只會顯示2列(MedSequence和Prognosis),而其他所有列只能通過propertyGrid1編輯,組織學是一種特殊情況,因爲它必須在propertyGrid1中顯示爲下拉值列表。