2012-03-01 181 views
2

如何設置此值?我有一個DataTable與我想在組合框中設置的所有數據,但我無法找到如何設置它。ComboBox.ValueMember和DisplayMember

我試圖

ComboBox1.DataSource = dataTable; 
ComboBox1.ValueMember = "id"; // --> once hes here, he just jumps out the method 
ComboBox1.DisplayMember = "name"; 

沒有編譯錯誤,警告,沒什麼..只是跳了出來!

這是查詢填補的DataTable

"Select * from \"Table\"" 

我與調試檢查,並在數據表中瀰漫。列名稱是「id」和「name」。組合框是空白的。我第一次填充它!

+1

這實際上不會編譯。 – SLaks 2012-03-01 18:41:39

+0

不,我錯了......這是與「身份證」和「名稱」。斯里布特 – dbncourt 2012-03-01 18:56:19

+0

可以id爲空? – Arie 2013-03-14 15:00:04

回答

1

他們採取串...

ComboBox1.ValueMember = "id"; 
ComboBox1.DisplayMember = "name"; 
+0

mmm,nop!它不起作用。 ü看到,dataTable具有值,因爲我檢查與debbuger,這些列名稱是完全id和名稱。如果我把它像你一樣,id列在組合框中,出於某種原因,idk cuz名稱中包含名稱。它永遠不會到達displaymamber線。 – dbncourt 2012-03-01 18:51:29

+0

我認爲dataTable不是一個有效的源,我看到它與DataSource,但我沒有:/,也許我可以解析DataTable到一個DataSource? – dbncourt 2012-03-01 18:52:53

+0

這是最好的基於提供的代碼可以提供的... – 2012-03-01 18:53:03

0

您可以指定這樣

ComboBox1.ValueMember = "id"; 
    ComboBox1.DisplayMember = "name"; 
2
ComboBox1.DataSource= dt; //the data table which contains data 
    ComboBox1.ValueMember = "id"; // column name which you want in SelectedValue 
    ComboBox1.DisplayMember = "name"; // column name that you need to display as text 
+0

ComboBox1.DataBind();這不存在。至少不在我的版本(Visual Studio 2010)ComboBox.DataBindings中。並不是一種方法。 – dbncourt 2012-03-01 19:10:07

+0

DataBind()僅適用於Web應用程序;如果它是一個Windows應用程序,則不需要該行 – PraveenVenu 2012-03-01 19:54:48

11

你不應該設置你的列表框和/或組合框的datasource順序

ComboBox1.DataSource = dataTable; 

ComboBox1.ValueMember = "id"; 

ComboBox1.DisplayMember = "name"; 

相反,這是正確的順序:

ComboBox1.ValueMember = "id"; 

ComboBox1.DisplayMember = "name"; 

ComboBox1.DataSource = dataTable; 

注意:設置datasource應該是最後一道防線。

如果您先設置datasource,則SelectedIndexChanged事件將觸發,您可能會收到投射錯誤或其他異常。

+0

沒有意義;如果您不首先給數據源賦予組合框,那麼它會如何知道「ValueMember」應該是什麼,如果它沒有數據,「DisplayMember」應該是什麼。這是一種反直覺的做法。 – John 2015-05-07 20:31:08

+0

@John你是對的,它是反直覺的,但它的工作原理。搜索combobox datarowview,你會看到其他人有同樣的問題。 – DrewJordan 2015-05-22 19:08:02

+2

@John如果你看看它在內部是如何工作的,你會明白,最後設置Datasource對性能至關重要。因爲設置'ValueMember'不會觸發任何操作。如果您先設置Datasource,則cbo將爲您綁定值成員。然後,您將設置新的ValueMember [您想要的],並且cbo將不得不重新綁定綁定。因此,如果您將DS設置爲最後一次,綁定只會發生一次。 – 2016-06-28 02:55:39

1
public class ComboDeger { 
    private string yazi; 
    private int deger; 
    public ComboDeger(string stryazi, int strdeger) { 
     this.yazi = stryazi; 
     this.deger = strdeger; 
    } 
    public string yazisi { 
     get { 
      return yazi; 
     } 
    } 
    public int degeri { 
     get { 
      return deger; 
     } 
    } 
} 
private void combobox_doldur() { 
    ArrayList ComboDegerleri = new ArrayList(); 
    ComboDegerleri.Add(new ComboDeger("9 : NORMAL", 9)); 
    ComboDegerleri.Add(new ComboDeger("10 : ENGELLİ", 10)); 
    comboBox1.DataSource = ComboDegerleri; 
    comboBox1.DisplayMember = "yazisi"; 
    comboBox1.ValueMember = "degeri"; 
} 
private void Form3_Load(object sender, EventArgs e) { 
    con.Open(); 
    combobox_doldur(); 

    // Populate the COMBOBOX using an array as DataSource. 
} 
+1

你的回答應該包含你的代碼的解釋和描述它是如何解決問題的。 – AbcAeffchen 2014-12-13 00:14:47

1

我有同樣的麻煩。在我的情況下,SelectedIndexChanged事件觸發,只是跳出該方法。請嘗試不要使用SelectedIndexChanged事件。或者是這樣的:

ComboBox1.SelectedIndexChanged -= new System.EventHandler(ComboBox1_SelectedIndexChanged); 
ComboBox1.DataSource = dataTable; 
ComboBox1.ValueMember = "id"; 
ComboBox1.DisplayMember = "name"; 
ComboBox1.SelectedIndexChanged += new System.EventHandler(ComboBox1_SelectedIndexChanged); 

它對我有用。 =)

1

使用鍵值對填充ComboBox

一個巧妙的辦法來填充組合框是將數據源設置爲鍵值對的列表。它也可能激發使用存儲在某種類型的列表數據:

//Some values to show in combobox 
string[] ports= new string[3] {"COM1", "COM2", "COM3"}; 

//Set datasource to string array converted to list of keyvaluepairs 
combobox.Datasource = ports.Select(p => new KeyValuePair<string, string>(p, p)).ToList(); 

//Configure the combo control 
combobox.DisplayMember = "Key"; 
combobox.ValueMember = "Value"; 
combobox.SelectedValue = ports[0]; 

數據源可以使用此語法以及填充:

ports.Select(p => new { Key = p, Value = p }).ToList(); 

的technicue可與多種更多的屬性名擴大列列表。

0
ComboBox1.ValueMember = dataTable.Columns["id"].ColumnsName; // column name which the values are not visible 
ComboBox1.DisplayMember = dataTable.Columns ["name"].ColumnsName; 
/* 
     column name that you need to select item by proprity : 
ComboBox1.SelectedItem; 
Or you can use easly this : 
ComboBox1.Text; 
*/ 

ComboBox1.DataSource= dataTable; //the data table which contains data 
// and this should be last :) 
相關問題