2014-02-14 30 views
1

我使用下面的函數來填充我ComboBox一個ComboBox人口問題

public static void FillDropDownList(string Query, System.Windows.Forms.ComboBox DropDownName, string AValue, string Adisplay) 
    { 
     string Value = AValue; 
     string display = Adisplay; 
     using (var CONN = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\Test.accdb;")) 
     { 
      CONN.Open(); 
      DataTable dt = new DataTable(); 
      try 
      { 
       OleDbCommand cmd = new OleDbCommand(Query, CONN); 
       OleDbDataReader myReader = cmd.ExecuteReader(); 
       dt.Load(myReader); 
      } 
      catch (OleDbException e) 
      { 
       MessageBox.Show(e.ToString()); 
       return; 
      } 
      DropDownName.DataSource = dt; 
      DropDownName.ValueMember = Value; 
      DropDownName.DisplayMember = display; 
     } 
    } 

而且我稱其爲負載形式:

private void Form1_Load(object sender, EventArgs e) 
{ 
    FillDropDownList("select CountryCode,Countryname from Countries", comboBox1, "CountryCode", "Countryname"); 

} 

2.After我使用在Selectedindexchanged事件中使用相同的函數來填充另一個組合框:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
{    
    FillDropDownList("select StateCode,StateName from States Where CountryCode = '" + comboBox1.SelectedValue + "'", comboBox2, "StateCode", "StateName"); 

} 

並且兩個組合框的一切的人口工作正常,但這裏的問題 我有兩個組合框的如圖所示的圖:

enter image description here

所以TE第一組合框(國家)加載完美的形式 但我我試圖做的是僅在選擇國家時才從數據庫中選擇第二個組合框(狀態),但是發生的是代碼運行並且第二個組合框從數據庫中選擇,並且從數據庫中選擇第一個組合如圖所示

enter image description here

所以我基本上想要做的是讓第二個組合僅在我從第一個組合框中選擇一個索引時才被填充。

回答

1

代碼放在SelectionChangeCommitted而不是SelectedIndexChanged

private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e) 
{ 
    FillDropDownList("select StateCode,StateName from States Where CountryCode = '" + comboBox1.SelectedValue + "'", comboBox2, "StateCode", "StateName"); 
} 
0

我認爲你的問題是因爲第一個組合框的人口觸發事件來填充第二個。一種解決方法是在comboBox1_SelectedIndexChanged(object sender,EventArgs e)中使用類似下面的代碼。

if (comboBox1.Text == string.Empty) { return; } 

如果不工作,請嘗試使用 「的SelectedIndex> 0」 或 「的SelectedValue」 屬性。

作爲一個注意事項,如果任何人能夠修改您的組合框項目,您的代碼可能傾向於SQL注入攻擊。

0

您需要確定使用SelectedIndex財產羯羊該項目真正從組合框改變與否。

試試這個:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 

    if(comboBox1.SelectedIndex >= 0) 
    { 
     FillDropDownList("select StateCode,StateName from States Where CountryCode = '" + comboBox1.SelectedValue + "'", comboBox2, "StateCode", "StateName"); 
    } 

} 
0

更改下面的方法來

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
{    
    FillDropDownList("select StateCode,StateName from States Where CountryCode = '" + comboBox1.SelectedValue + "'", comboBox2, "StateCode", "StateName"); 

} 

      private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (comboBox1.SelectedIndex != -1 && comboBox2.SelectedIndex != -1) 
      { 
       FillDropDownList("select StateCode,StateName from States Where CountryCode = '" + comboBox1.SelectedValue + "'", comboBox2, "StateCode", "StateName"); 
      } 

     } 

提交查詢之前,DB您驗證這兩個組合框。檢查任何選定的項目。

感謝 SRIKANTH

0

調用FillDropDownList方法之前取出SelectedIndexChanged事件處理程序,並填充ComboBox後重新應用它。

private void Form1_Load(object sender, EventArgs e) 
{ 
    comboBox1.SelectedIndexChanged -= comboBox1_SelectedIndexChanged; 
    FillDropDownList("select CountryCode,Countryname from Countries", comboBox1, "CountryCode", "Countryname"); 
    comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged; 
}