2013-06-19 21 views
0

我想在加載表單時將一些鍵/值從數據表填充到組合框中。並期望當用戶在組合框上進行選擇時,會在SelectedValueChanged事件中執行一些語句。在form_load中填充組合框,但觸發SelectedValueChanged

然而,當我使用填充數據如下:

private void Form1_Load(object sender, EventArgs e) 
    { 
     comboBox1.DropDownStyle = ComboBoxStyle.DropDownList; 

     DataTable dt = new DataTable(); 
     dt.Columns.Add("id", typeof(int)); 
     dt.Columns.Add("name", typeof(string)); 

     dt.Rows.Add(1, "A1"); 
     dt.Rows.Add(2, "A2"); 
     comboBox1.DataSource = dt; 
     comboBox1.DisplayMember = "name"; 
     comboBox1.ValueMember = "id"; 
    } 

與以下SelectedValueChanged事件:

private void comboBox1_SelectedValueChanged(object sender, EventArgs e) 
    { 
     MessageBox.Show("FOO"); 

    } 

一旦程序運行時, 「foo」 的消息框被示出出乎意料兩次,前一個用戶可以選擇任何東西

什麼問題?

THX

+0

當您添加項目到'ComboBox'則觸發該事件最有可能的。 –

回答

0

的問題是由設計,當你的組合框與新產品的更新,它的SelectedValue被設計改變。爲了避免這種情況,可以用某種標誌是這樣的:

private bool init; 
private void Form1_Load(object sender, EventArgs e) 
{ 
    comboBox1.DropDownStyle = ComboBoxStyle.DropDownList; 

    DataTable dt = new DataTable(); 
    dt.Columns.Add("id", typeof(int)); 
    dt.Columns.Add("name", typeof(string)); 

    dt.Rows.Add(1, "A1"); 
    dt.Rows.Add(2, "A2"); 
    init = true; 
    comboBox1.DataSource = dt; 
    comboBox1.DisplayMember = "name"; 
    comboBox1.ValueMember = "id"; 
    init = false; 
} 
private void comboBox1_SelectedValueChanged(object sender, EventArgs e) 
{ 
    if(!init) MessageBox.Show("FOO"); 
} 
0

而是通過設計師,註冊事件處理程序,你在事件處理程序的結束充滿了ComboBox後:

private void Form1_Load(object sender, EventArgs e) 
{ 
    comboBox1.DropDownStyle = ComboBoxStyle.DropDownList; 

    DataTable dt = new DataTable(); 
    dt.Columns.Add("id", typeof(int)); 
    dt.Columns.Add("name", typeof(string)); 

    dt.Rows.Add(1, "A1"); 
    dt.Rows.Add(2, "A2"); 
    comboBox1.DataSource = dt; 
    comboBox1.DisplayMember = "name"; 
    comboBox1.ValueMember = "id"; 
    comboBox1.SelectedValueChanged += comboBox1_SelectedValueChanged 
} 
0

加入到金王的回答..

private void comboBox1_SelectedValueChanged(object sender, EventArgs e) 
{ 
    if(init) Return; 

    //codes here 
}