2013-12-08 5 views
0

Запустив следующий код, я обнаружил, что метод SelectedIndexChanged работает до метода загрузки ... Как я могу это исправить? Я попытался сбросить события, но это не сработало ниОшибка при получении элементов в combobox из таблицы

namespace adotestquestion 
{ 
    public partial class Bill : Form 
    { 
     public Bill() 
     { 
      InitializeComponent(); 
     } 
     string constring = "data source=NISHANT-PC ; initial catalog=NIK_DATABASE ; user id=xxxxxx ; password=xxxxxx"; 
     SqlConnection con; 
     SqlCommand cmd; 
     SqlDataAdapter adapter; 
     DataSet ds; 
     DataTable dt; 
     int qty, tax, total, price; 

     private void Bill_Load(object sender, EventArgs e) 
     { 
      con = new SqlConnection(constring); 
      cmd = new SqlCommand("select billid from bill", con); 
      adapter = new SqlDataAdapter(cmd); 
      ds = new DataSet(); 
      adapter.Fill(ds); 
      dt = ds.Tables[0]; 
      comboBox1.DataSource = dt; 
      comboBox1.DisplayMember = "billid"; 
      comboBox1.ValueMember = "billid"; 
      MessageBox.Show(id.ToString()); 
     } 

     private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      MessageBox.Show(comboBox1.Text); 
      int id; 
      id = Convert.ToInt32(comboBox1.Text); 
      con = new SqlConnection(constring); 
      cmd = new SqlCommand("select * from bill where [email protected]", con); 
      // cmd.Parameters.Add("@id", Convert.ToInt32(comboBox1.Text)); 
      cmd.Parameters.Add("@id", id); 
      adapter = new SqlDataAdapter(cmd); 
      ds = new DataSet(); 
      adapter.Fill(ds); 
      dt = ds.Tables[0]; 

      foreach (DataRow dr in dt.Rows) 
      { 
       textBox1.Text = dr[1].ToString(); 
       textBox2.Text = dr[2].ToString(); 
       textBox3.Text = dr[4].ToString(); 
       textBox4.Text = dr[3].ToString(); 
       textBox5.Text = dr[5].ToString(); 
       textBox6.Text = dr[6].ToString(); 
       textBox7.Text = dr[7].ToString(); 
       textBox8.Text = dr[8].ToString(); 
       textBox9.Text = dr[9].ToString(); 
       textBox10.Text = dr[10].ToString(); 
      } 
     } 

    } 
} 

ответ

1

Unwire подписки события в InitializeComponent методе и коммутации, в конце .

1

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

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (comboBox1.SelectedIndex >= 0) 
    { 
     // your existing code goes here 
    } 
} 
1

Третий вариант заключается в создании частной переменной уровня класса как isFormLoading и установить его на true первоначально, а затем установить его на false в конце вашего Bill_Load события.

Вы можете проверить значение переменной в comboBox1_SelectedIndexChanged и в любом другом месте, чтобы определить, должен ли выполняться блок кода или нет.

Но на самом деле любой другой предоставленный ответ будет работать.

1

Задача: всякий раз, когда вы связываете предметы с Combobox, SelectedIndexChanged Событие будет уволено.

Решение: внутри SelectedIndexChanged событий необходимо определить его кастрированный баран уволен из Load события или в связи с изменением выбора товара.

вы можете объявить переменную boolean, установить ее в true всякий раз, когда управление входит в событие Load.

от selectedIndexChanged Событие только выполняет код, когда boolean переменная false.

Примечание: в конце Load события снова изменить переменную boolean в false так что SelectionChanged событие будет срабатывать, когда на самом деле изменения выбора в ComboBox.

Попробуйте:

bool loadevent = false; 


private void Bill_Load(object sender, EventArgs e) 
{ 
    loadevent = true; 
    con = new SqlConnection(constring); 
    cmd = new SqlCommand("select billid from bill", con); 
    adapter = new SqlDataAdapter(cmd); 
    ds = new DataSet(); 
    adapter.Fill(ds); 
    dt = ds.Tables[0]; 
    comboBox1.DataSource = dt; 
    comboBox1.DisplayMember = "billid"; 
    comboBox1.ValueMember = "billid"; 
    MessageBox.Show(id.ToString()); 
    loadevent = false; 
} 



private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (!loadevent) 
    { 
    MessageBox.Show(comboBox1.Text); 
    int id; 
    id = Convert.ToInt32(comboBox1.Text); 
    con = new SqlConnection(constring); 
    cmd = new SqlCommand("select * from bill where [email protected]", con); 
    // cmd.Parameters.Add("@id", Convert.ToInt32(comboBox1.Text)); 
    cmd.Parameters.Add("@id", id); 
    adapter = new SqlDataAdapter(cmd); 
    ds = new DataSet(); 
    adapter.Fill(ds); 
    dt = ds.Tables[0]; 

    foreach (DataRow dr in dt.Rows) 
    { 
     textBox1.Text = dr[1].ToString(); 
     textBox2.Text = dr[2].ToString(); 
     textBox3.Text = dr[4].ToString(); 
     textBox4.Text = dr[3].ToString(); 
     textBox5.Text = dr[5].ToString(); 
     textBox6.Text = dr[6].ToString(); 
     textBox7.Text = dr[7].ToString(); 
     textBox8.Text = dr[8].ToString(); 
     textBox9.Text = dr[9].ToString(); 
     textBox10.Text = dr[10].ToString(); 
    } 
} 
} 
+0

Вы, возможно, придется переместить 'loadevent = true' к концу мероприятия "нагрузки". Линией, которая устанавливает 'ComboBox.DataSource', может быть то, что запускает событие SelectedIndexChanged. –

+0

@GrantWinney: да в конце события загрузки мне нужно вернуть его в false. отредактировал мой ответ. –

Смежные вопросы