2016-11-17 56 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」功能的組合框基於「fillCombo」功能選擇的表值了。例如。如果在我的組合框中有由「fillLiguanea」填充的名稱爲「cat」和「dog」的表格,那麼當選擇它時,它應該自動更改由「fillLiguanea」填充的各種貓或狗品種的組合框。

我在看書,看到了一些關於SelectionChangeCommitted事件。這是要走的路還是有更好的方法來做到這一點?

我已經通過刷新按鈕針對我的第二個組合框來實現這一點,但我寧願消除用戶

+0

是啊,我只是使用下列事件之一「SelectionChangeCommitted」或「的SelectedIndexChanged」或「SelectedValueChanged」。請注意,清除組合框不會引發上述任何事件。 – RoyalPotato

+0

我將如何去包括它?我不知道它的實施 – Jevon

+0

我有'如果(comboBox1.SelectionChangeCommitted ==)' 我不知道我是什麼測試@RoyalPotato – Jevon

回答

0

這原來是一個簡單的解決方案。我只是將fillCombo函數中的comboBox傳遞給了fillLiguanea函數,並且所有工作都按照我的要求工作。這兩種功能如下:

這是fillCombo方法是從SQL數據庫到我的組合框被稱爲「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.aspxhttps://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!")

之所以這麼說,這如何適用於您的具體問題?那麼,組合框控件已經包含該事件。所以你顯然不必自己定義。這意味着你所負責的全部都是訂閱該事件。

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); 
} 

最後,如果你使用Visual Studio中的WindowsForms設計師 某處屬性窗格中應該有辦法查看所選控件的事件。向下滾動到您想要的事件。雙擊它。 Visual Studio應該自動創建一個方法並用新方法訂閱事件。

事件和代表的背後有如此多的力量。我極力鼓勵你對他們進行一些閱讀。 對不起,這不像我想象的那麼小,但我想我會試圖解釋爲什麼它的作品,而不僅僅是「這是應該如何做」。

相關問題