2015-09-16 102 views
0

我有一個窗體窗體應用程序。在表單中,我有一個ComboBox和一個列表框。當我選擇組合框時,我想顯示用戶可以在checkListBox中檢查的項目列表,我想出瞭如何將數據綁定到組合框部分,但我不確定如何顯示值列表,以便用戶可以在checkListBox中選擇。假設我有一個存儲在SQL數據庫調用item_table中的項目列表,我如何根據何時從組合框中選擇將其顯示到checkListBox?代碼供參考將不勝感激。由於當選擇組合框項目時,顯示項目列表到CheckListBox

例如,

讓的說,用戶從下拉框中選擇「艾米」,該checkListBox將顯示項目列表「項目1,項目2,項目3,ITEM4」。

當用戶從下拉框中選擇「布拉德」,它會顯示物品的清單:「項目2,ITEM5,item10

這裏是我的數據庫表中(SQL)服務器

user_Detail 
    In my user_Detail table , I have 10 user and each of them have a primary key (userId) and a column (userName); 

item_Detail 
    In my item_Detail table, I have 20 items and they also have a primary key (itemId) and a column (itemName) 

在SQL控制檯,我內連接兩個表(這我不知道,如果我需要做同樣的在我的SqlCommand代碼)

這是我的控制檯中的sql命令。

 select 
      user_Detail.userId, 
      user_Detail.userName, 
      item_Detail.itemId, 
      item_Detail.itemName 
     from 
      item_Detail 
     INNER JOIN user_Detail ON user_Detail.userId = item_Detail.itemId 

這裏是我的代碼

namespace Test { 

    public partial class MainForm: Form { 
     SqlConnection myConn; 
     SqlCommand myCommand; 
     SqlDataReader myReader; 
     SqlDataAdapter myDa; 
     DataTable dt; 
     DataSet ds = new DataSet(); 

     public MainForm() { 
      InitializeComponent(); 

      // loadComboBox 
      loadComboBox(); 

     } 

     //Connect to my db to fetch the data when the application load 

     private void loadComboBox() { 
    myConn = new SqlConnection("Server = localhost; Initial Catalog= dbName; Trusted_Connection = True"); 
      string query = "Select * from user_Detail"; 

      myCommand = new SqlCommand(query, myConn); 

      try { 
       myConn.Open(); 
       myReader = myCommand.ExecuteReader(); 
       string s = "<------------- Select an item ----------->"; 
       itemComboBox.Items.Add(s); 
       itemComboBox.Text = s; 

       while (myReader.Read()) { 
        //declare a string 
        object userId = myReader[userId"]; 
        object userName = myReader["userName"]; 

        //my comboBox named userComboBox 
        userComboBox.Items.Add(userName.ToString()); 
       } 
      } catch (Exception ex) { 
       MessageBox.Show(ex.Message); 
      } 
     } 

     //Display some items here (this is my checkListBox 
    private item_checkListBox(Object sender, EventArgs e){ 



    } 


    private void load_item(){ 




    } 

回答

1

我希望這可以幫助你。

首先,我只是想修復你的loadComboBox(),因爲讀它可能會導致混淆。

private void loadComboBox() { 
     myConn = new SqlConnection("Server = localhost; Initial Catalog=dbName; Trusted_Connection = True"); 
     string query = "Select * from user_Detail"; 

     myCommand = new SqlCommand(query, myConn); 

     try { 
      myConn.Open(); 
      myReader = myCommand.ExecuteReader(); 
      string s = "<------------- Select an item ----------->"; 
      itemComboBox.Items.Add(s); 
      itemComboBox.Text = s; 

      while (myReader.Read()) { 
       //declare a string 
       string userId = myReader["userId"].toString(); 
       string userName = myReader["userName"].toString(); 

       //my comboBox named userComboBox 
       userComboBox.Items.Add(userName); 
      } 

      myConn.Close(); 
     } catch (Exception ex) { 
      MessageBox.Show(ex.Message); 
     } 
    } 

確保在使用它後關閉sql連接。如果你打算使用它,再次打開它。

現在,您已將用戶的用戶名添加到組合框中。

接下來讓我們創建一個事件,只要您從組合框中選擇,就會觸發該事件。

userComboBox.SelectedIndexChanged += (o,ev) => { ChangeCheckListItems(); }; 

上述代碼可以讀作:「如果userComboBox改選擇的索引,呼叫ChangeCheckListItems()方法」。每當你改變選擇時,我們都會調用上述方法。您可以將該代碼放在您的類構造函數中。

現在ChangeCheckListItems()方法必須包含什麼。

private void ChangeCheckListItems(){ 
    myCheckListBox.Items.Clear(); 
    string selectedText = userComboBox.Text; 

    switch(selectedText){ 
      case "Amy": 
      AddItemsForAmy(); 
      break; 
      case "Brad": 
      AddItemsForBrad(); 
      break: 
    } 

} 

首先,我們確保在添加項目之前清除myCheckListBox以避免重複,因爲此方法會觸發每個選擇更改。

接下來,我們從userComboBox中獲取選定的文本。

然後我們將使用一個開關來選擇我們要做的取決於所選的userComboBox。

AddItemsForAmy()和AddItemsForBrad()只是示例方法。

例如:

private void AddItemsForAmy(){ 

    myConn = new SqlConnection("Server = localhost; Initial Catalog=dbName   Trusted_Connection=true;" 
    string query = "Select * from item_Detail where itemId % 2 = 0" 
    myCommand = new SqlCommand(query, myConn); 

    try{ 
     myConn.Open(); 
     myReader = myCommand.ExecuteReader(); 

     while(myReader.Read()){ 

     string itemName = myReader["itemName"].toString(); 
     myCheckListBox.Items.Add(itemName); 
     } 
     myConn.Close(); 
    } 
    catch(SqlExcetion ex){ 
      MessageBox.Show(ex.Message); 
    } 
} 

所以在我上面的例子中,我選擇用的itemId是偶數的所有項目。 然後在while()部分,我將這些項目添加到清單框。

它是您選擇要爲您的數據庫中的Amy,Brad和其他可能的用戶顯示哪些項目。您也可以使用參數化方法來獲得較短的解決方案。希望這可以幫助。對不起,如果它很長。

+0

您好賈斯廷,感謝您的回覆,我會試一試。只是想知道,是'userComboBox.SelectedIndexChanged + =(o,ev)=> {ChangeCheckListItems(); }; while循環之後和myConn.Close()之前的代碼?還有我得到你爲什麼試圖在那裏做swtich語句,如果comboBox中只有2個項目,這個工作很好,但是如果我有10個項目,讓我們說,做所有的開關案例會很痛苦嗎?我們可以以某種方式在foreach循環中循環遍歷comboBox中的每個項目嗎? – RedRocket

+0

你可以在你的構造函數的InitializeComponent()之後。 正如我所說的,你可以使用參數化的方法。就像是。 '私人無效AddItemsToCheckListBox(字符串用戶名){ //創建一個查詢,將返回您需要爲用戶的所有項目。 } ' –

+0

謝謝,如果我們不使用開關盒,是另一種方式嗎?因爲我的組合框中有10個或更多的項目。這樣做會很痛苦:/ – RedRocket