2016-11-17 1 views
1

У меня есть две функций с первым заполняющим выпадающим с таблицами внутри моей базы данных SQL, это она ниже:изменений, основанные на мыши я другой

private void FillCombo() 
    { 
     comboBox1.Items.Clear(); 
     try 
     { 

      string connectionString = "Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True"; 
      using (SqlConnection con2 = new SqlConnection(connectionString)) 
      { 
       con2.Open(); 
       string query = "SELECT * FROM INFORMATION_SCHEMA.TABLES "; 
       SqlCommand cmd2 = new SqlCommand(query, con2); 

       SqlDataReader dr2 = cmd2.ExecuteReader(); 
       while (dr2.Read()) 
       { 
        int col = dr2.GetOrdinal("TABLE_NAME"); 
        comboBox1.Items.Add(dr2[col].ToString()); 
       } 
       comboBox1.SelectedIndex = 0; 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 

И у меня есть еще один, который заполняет второй comboBox на основе значения из выпадающего списка предыдущей функции. Это его ниже

async void fillLiguanea() 
    { 
     comboBox2.Items.Clear(); 

      try 
      { 

       string connectionString = "Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True"; 
       SqlConnection con = new SqlConnection(connectionString); 
       con.Open(); 
       string query = "SELECT * FROM " + comboBox1.Text; 
       SqlCommand cmd = new SqlCommand(query, con); 
       var reader = await cmd.ExecuteReaderAsync(); 
       comboBox2.BeginUpdate(); 
       while (reader.Read()) 
       { 
        string scode = reader.GetString(reader.GetOrdinal("code")); 
        comboBox2.Items.Add(scode); 
       } 
       comboBox2.EndUpdate(); 
       comboBox2.SelectedIndex = 0; 

      } 
      catch (Exception ex) 
      { 

       MessageBox.Show(ex.ToString()); 
      }} 

Что я пытаюсь сделать, это обновить «fillLiguanea» значение COMBOBOX функции, основанное на таблице, выбранной в функции «fillCombo». Например. если в моем comboBox есть таблицы с именем «cat» и «dog», который заполняется «fillLiguanea», тогда при выборе он должен автоматически изменять comboBox, который заполняется «fillLiguanea» различными кошками или собаками.

Я читал и видел что-то о событии SelectionChangeCommitted. Это способ пойти или есть лучший способ сделать это?

Я достиг этого с помощью кнопки обновления, ориентированной моего второго COMBOBOX, но я предпочел бы исключить использование кнопок для пользователя

+0

Да, я бы просто использовать один из следующих событий «SelectionChangeCommitted» или «SelectedIndexChanged» или "SelectedValueChanged". Обратите внимание, что очистка combobox не приведет к возникновению каких-либо из вышеупомянутых событий. – RoyalPotato

+0

Как бы я включил его? Я не уверен в его реализации. – Jevon

+0

У меня есть 'if (comboBox1.SelectionChangeCommitted ==)' Не уверен, что я тестирую @RoyalPotato – Jevon

ответ

0

Это оказалось простым решением. Я просто передал comboBox из функции fillCombo в функцию fillLiguanea, и все работало так, как я хотел. Эти две функции перечислены ниже:

Это метод fillCombo который заселение из базы данных SQL к моему COMBOBOX под названием «comboBox4»

private void FillCombo() 
    { 



      comboBox4.Items.Clear(); 


      try 
      { 

       string connectionString = "Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True"; 
       using (SqlConnection con2 = new SqlConnection(connectionString)) 
       { 
        con2.Open(); 
        string query = "SELECT * FROM INFORMATION_SCHEMA.TABLES "; 
        SqlCommand cmd2 = new SqlCommand(query, con2); 

        SqlDataReader dr2 = cmd2.ExecuteReader(); 
        while (dr2.Read()) 
        { 
         int col = dr2.GetOrdinal("TABLE_NAME"); 
         comboBox4.Items.Add(dr2[col].ToString()); 
        } 
        // comboBox4.SelectedIndex = 0; 

       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 

И это мой метод fillLiguanea, который обновляет таблицу, основанную на comboBox4 выбор из моей выше функции.

async void fillLiguanea() 
    { 
     comboBox2.Items.Clear(); 
     try 
     { 

      string connectionString = "Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True"; 
      SqlConnection con = new SqlConnection(connectionString); 
      con.Open(); 
      string query = "SELECT * FROM " + comboBox4.Text; 
      SqlCommand cmd = new SqlCommand(query, con); 
      var reader = await cmd.ExecuteReaderAsync(); 
      comboBox2.BeginUpdate(); 
      while (reader.Read()) 
      { 
       string scode = reader.GetString(reader.GetOrdinal("code")); 
       comboBox2.Items.Add(scode); 
      } 
      comboBox2.EndUpdate(); 
      comboBox2.SelectedIndex = 0; 
      // comboBox2.Sorted = true; 
     } 

Это важная строка кода:

string query = "SELECT * FROM " + comboBox4.Text; 

С, что все было решено

0

Вы должны использовать events.

См: https://msdn.microsoft.com/en-us/library/awbftdfh.aspx, https://msdn.microsoft.com/en-us/library/edzehd2t(v=vs.110).aspx

Короче говоря, событие это просто способ для запуска кода, следуя Observer Pattern.

В принципе, событие представляет собой несколько методов (я буду называть их «подписчиками», поскольку они «подписываются» на событие), которые все вызываются, когда событие возникает из класса, в котором он определен. «Окей», можно сказать. «Но при реализации метода, который будет вызываться, когда возникает событие, как я могу убедиться, что у меня есть правильные типы параметров?». Delegates.

Делегат представляет собой сигнатуру метода (т. Е. Количество параметров/типов параметров/тип возвращаемого метода). Каждое событие объявляется типом определенного делегата.

Например, предположим, что вам нужно событие, которое вызовет его методы подписки при получении произвольного сообщения. Как бы вы настроили такую ​​систему, используя эти вещи под названием «События»?

  1. Определите ваш делегат

    public delegate void MessageDelegate(string data);

    Это означает (и навязывает), что все подписавшиеся методы к событию сусло содержат только один параметр и его тип должен быть string. Кроме того, каждый метод подписки не должен возвращать какое-либо значение.

  2. Определите ваше мероприятие

    public event MessageDelegate MessageReceived;

    Это говорит о том, что мы создаем событие (сбор подписных методов), где каждый метод подписки должен соответствовать подписям, определенным делегатом MessageDelegate.

  3. Подписаться на мероприятие (вероятно, часть вы наиболее заинтересованы в) Чтобы подписаться на событие (или добавить метод сбора мероприятия абонентов), вы должны сначала создать метод, который соответствует делегату:

    private void OnMessageReceived(string msg) { //Do something with the received message. }

    Затем идет фактическое Подписавшаяся:

    MessageReceived += new MessageDelegate(OnMessageReceived).

    Теперь, когда событие запускается, вызывается наш метод OnMessageReceived.

  4. Наконец, чтобы вызвать или повышения события (процесс вызова каждого метод подписавшего) вы можете просто сделать: MessageReceived("Hello World!")

Все, что было сказано, как это относится к вашим конкретным проблемам? Ну, элемент управления combobox уже содержит событие. Таким образом, вы, очевидно, не должны сами определять это. Это означает, что все, за что вы несете ответственность, подписывается на мероприятие.

comboBox1.SelectionChangeCommitted += new EventHandler(comboBox1_SelectionChangeCommitted); 

private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e) 
{ 
    //Refresh combobox 2. 
} 

Я рекомендую вам поставить реальную подписку в случае формы.

private void Form1_Load(object sender, EventArgs e) 
{ 
    comboBox1.SelectionChangeCommitted += new EventHandler(comboBox1_SelectionChangeCommitted); 
} 

Теперь, однако, вы должны подписаться на событие загрузки формы. Как правило, в конструкторе после звонок InitializeComponent.

public Form1() 
{ 
    InitializeComponent(); 
    Load += new EventHandler(Form1_Load); 
} 

Вы можете, конечно, обойти подписную форму загрузки

public Form1() 
{ 
    InitializeComponent(); 
    comboBox1.SelectionChangeCommitted += new EventHandler(comboBox1_SelectionChangeCommitted); 
} 

Наконец, если вы используете конструктор WindowsForms в Visual Studio: Где-то на панели свойств должно быть способом просмотреть события для выбранного элемента управления. Прокрутите вниз до желаемого события. Дважды щелкните по нему. Visual studio должен автоматически создать метод и подписаться на событие с помощью нового метода.

Существует так много возможностей для событий и делегатов. Я очень рекомендую вам немного почитать их. Извините, что это было не так мало, как я предполагал, но я думал, что постараюсь объяснить , почему работает, а не просто «Вот как это должно быть сделано».

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