2014-02-14 4 views
1

Я использую следующую функцию, чтобы заполнить мою 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.Посль, что я использую ту же функцию в случае события Selectedindexchanged для заполнения другого ComboBox:

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

} 

И для население всего в два COMBOBOX прекрасно работает, однако здесь вопрос У меня есть два выпадающие, как показан на картинке:

enter image description here

Так тэ первый выпадающий (страна) загружаются в виде отлично , но то, что я Я пытаюсь сделать это, чтобы второе поле со списком (состояние) было выбрано из базы данных только тогда, когда я выбираю страну, но происходит то, что код запускается, а второй combobox идет и выбирает из базы данных все, что выбранный индекс в первая комбо представлена ​​на рис.

enter image description here

Так что я в основном хочу сделать, это сделать второй Combo заполненным только тогда, когда я выбираю индекс из первого списка.

ответ

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 (отправитель объекта, EventArgs e).

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

Если это не работает, попробуйте использовать "SelectedIndex> 0" или свойство "SelectedValue".

В качестве примечания ваш код потенциально подвержен атакам SQL-инъекций, если кто-либо смог изменить ваши элементы со списком.

0

Вам нужно определить погоду элемент действительно изменяется от Combobox или не используя 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"); 
      } 

     } 

Перед отправкой запроса на БД вы валидацию как выпадающие списки. Проверьте наличие выбранного элемента.

Благодаря Srikanth

0

Удалить обработчик событий SelectedIndexChanged перед вызовом метода FillDropDownList и повторно применять его после того, как 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; 
} 
Смежные вопросы