2009-05-04 60 views
1

我正在使用DataTable從XML文件將項目填充到我的ComboBox。目前,我已經設置了一列是ComboBox的顯示成員,另一列是值成員。然而這可能並不總是適用於我,因爲我必須設置selectedItem參數,並且value成員可能不是唯一的。將DataRow設置爲ComboBox的值成員

我不知道表中的值成員是否有重複,所以我的想法是,我會把整個DataRow作爲ComboBox的值成員,然後使用ComboBox.SelectedITem =(DataRow )some_data_row;用於選擇,並且它總是選擇正確的ComboBox對象。

我該如何做到這一點?有沒有更好的方法來做到這一點?我願意接受建議,但是我可以同時接觸這兩個人,顯示會員和貴賓會員,這一點非常重要。

謝謝你的幫助!

編輯:也許我之前沒有足夠清楚,但是當我問,如果這是這裏最好的方法,我也問如何做到這一點。如果我沒有設置valuemember參數,SelectedItem是DataRowView類型的...請注意,我想使用selectedValue參數從ComboBox中選擇項目,如果我嘗試在沒有明確設置值成員的情況下做到這一點,拋出異常。

回答

0

首先感謝亞當羅賓遜,我相信你的回答是正確的,但這不是我想聽到的。我以不同的方式解決了我的問題,我認爲這對其他人可能有用,所以我在這裏發佈。

我做的是我創建了一個新類,在我的例子中,我將它命名爲ListObject,它有一個DataRow屬性(稍後您會看到它也適用於其他類型,我只是使用它,因爲這是我實際上作爲我的Item值屬性)。還重寫方法:

  • 字符串的ToString()
  • 布爾等於(obj對象)
  • INT GetHashCode()方法--is不需要在我的情況,但是Visual Studio的
    警告你應該覆蓋。

的想法是,我可以填補我自己的類的對象ComboBox.Items集合,顯示自定義字符串(如果我沒有算出來這個樣子,我的堆棧溢出的下一個問題可能會是有關自定義DisplayMembers從DataRow中讀取項目時)和比較只有一個類的項目(在我的情況下DataRow)。

因此,這裏的代碼,它的偉大工程(至少我想要用它做)。

public class ListObject 
{ 
    public DataRow element; 

    public String DisplayObject = null; 

    public ListObject(DataRow dr) 
    { 
     element = dr; 
    } 

    public ListObject(DataRow dr, String dspObject) 
    { 
     element = dr; 
     DisplayObject = dspObject; 
    } 

    public override String ToString() 
    { 
     if (DisplayObject == null) throw new Exception("DisplayObject property was not set."); 

     return element[DisplayObject].ToString(); 
    } 

    public override bool Equals(object obj) 
    { 
     if (obj.GetType() == typeof(ListObject)) 
      return Equals(((ListObject)obj).element, this.element); 
     else return base.Equals(obj); 
    } 

    public override int GetHashCode() 
    { 
     return base.GetHashCode(); 
    } 
} 

對我來說,它的偉大工程,因爲我可以只填寫組合框與foreach語句:

dtUsers.ReadXml(Program.Settings.xmlInputUsers); 

foreach(DataRow dr in dtUsers.Rows) 
{ 
    cmbUser.Items.Add(new ListObject(dr, "Name")); 
} 

當我得到的DataRow我要選擇我只是這樣做:

cmbUser.SelectedItem = new ListObject(dlg.SelectedDataRow); 

在哪裏,我不擔心將DisplayMember等,因爲只有DataRow中的進行比較,你的顯示參數仍然會從您填寫ComboBox.Items收集組。另外,由於toString方法被覆蓋,你可以真正定製你的輸出。

創建這個類是唯一可能的,因爲msdn上的文章ComboBox.SelectedItem屬性其中注意到SelectedItem屬性使用IndexOf方法工作。此方法使用Equals方法來確定相等性。

1

如果您綁定ListBoxDataTable,你實際上綁定到DataView,表示DataTableDataTable實現IListSource,並返回一個DataView)。您不能直接將SelectedItem設置爲DataRow實例,必須將其設置爲DataRowView實例。不幸的是,從DataRow獲得DataRowView並不容易。

只需通過DataRowView來完成所有的交互操作就可以做得更好。這將允許您明確設置SelectedItem

您不能使用SelectedValue屬性,您必須使用SelectedItem

0

這是最簡單的方式來獲得數據表的組合框

private void load() { 
DataTable dt = // get data from DB 
comboBox1.ValueMember = null; // allows you to get all fields in the obj to combobox 
comboBox1.DisplayMember = "ccType";//label displayed from dt 
comboBox1.DataSource = dt; 
} 
//to test 
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 

     DataRowView current = (DataRowView)comboBox1.SelectedValue; 
     string drs = current.Row["ID"].ToString(); 

    }