2013-12-12 134 views
1

創建了兩個組合框和一個名爲MAINCATE的表。如何從另一個組合框中填充相同形式的組合框?

我有一個代碼,但堅持以確定我應該使用什麼SQLQuery來獲得第二個組合框填充,由第一個組合框確定。

我只需要了解如何在基於mainCate第一組合框中選擇了第二個組合框填寫一點點幫助..

我需要做這樣的事情。如果組合框1 mainCate是「食品」,然後組合框2應顯示 「生,熟,水果和蔬菜」

這是什麼MAINCATE表內 - (http://i.imgur.com/qR90Z2B.png

這是我的代碼: -

DataSet ds1; 
DataSet ds2; 

public User() 
{ 
    InitializeComponent(); 
} 

private void User_Load(object sender, EventArgs e) 
{ 

    SqlConnection conn = new SqlConnection(); 
    conn.ConnectionString = "Data Source=PEWPEWDIEPIE\\SQLEXPRESS;Initial Catalog=master;Integrated Security=True"; 
    conn.Open(); 

    SqlDataAdapter daMain = new SqlDataAdapter("SELECT * FROM MAINCATE", conn); 
    ds1 = new DataSet(); 
    daMain.Fill(ds1, "Maincate"); 
    mainCatU.DisplayMember = "mainCate"; 
    mainCatU.ValueMember = "mainCate"; 
    mainCatU.DataSource = ds1.Tables["MAINCATE"]; 
    mainCatU.DropDownStyle = ComboBoxStyle.DropDownList; 
    mainCatU.Enabled = true; 

    SqlDataAdapter daSub = new SqlDataAdapter("SELECT >What should i do here?<", conn); 
    ds2 = new DataSet(); 
    daSub.Fill(ds2, "Subcate"); 
    subCatU.DisplayMember = "Subcat1"; 
    subCatU.ValueMember = "Subcat"; 
    subCatU.DataSource = ds2.Tables["MAINCATE"]; 
    subCatU.DropDownStyle = ComboBoxStyle.DropDownList; 
    subCatU.Enabled = true; 
    conn.Close(); 
} 

private void mainCatU_SelectionChangeCommitted(object sender, EventArgs e) 
{ 
    //have no idea if a code should be here.. 
} 

還是我應該這樣做?

SqlCommand cmd = new SqlCommand("select Subcat1,Subcat2,Subcat3,Subcat4 from MAINCATE where [email protected];", con); 

=========================================

@philip - 把這個頁面加載repalcing我上面的代碼 - 它沒有工作..

string result = mainCatU.SelectedItem.ToString(); 

      SqlDataAdapter daSub = new SqlDataAdapter("SELECT * FROM MAINCATE where mainCate = " + result , conn); 
      ds2 = new DataSet(); 
      daSub.Fill(ds2, "Subcate"); 
      subCatU.DisplayMember = "Subcat1"; 
      subCatU.ValueMember = "Subcat1"; 
      subCatU.DataSource = ds1.Tables["MAINCATE"]; 
      subCatU.DropDownStyle = ComboBoxStyle.DropDownList; 
      subCatU.Enabled = true; 

甚至試圖

SqlDataAdapter daSub = new SqlDataAdapter("SELECT * FROM MAINCATE where [email protected]", conn); 
+0

你甚至有執行SQL兩次?兩個盒子都有相同的數據源嗎? 如果是這樣,只需使用DS1上第二個框藏漢:) – JonE

+0

如果你獲得相同的數據,然後從Maincate,你應該再想想......「我在這裏重複碼」,你的選擇,所以你可以再只需爲兩個組合框使用相同的數據表即可。 –

+0

對不起..忘了採取這一點,當我甚至沒有使用它.. –

回答

1

實際上,您不需要另一個sql查詢,因爲您已經從數據庫獲取所有maincate記錄。您可以使用字典來存儲這些記錄。

首先定義一個Dictionary<string,List<string>>

這裏定義它(!)

DataSet ds1; 
DataSet ds2; 
Dictionary<string,List<string>> allRecords = new Dictionary<string,List<string>>(); 

則:(i編輯代碼)

SqlDataAdapter daMain = new SqlDataAdapter("SELECT * FROM MAINCATE", conn); 
ds1 = new DataSet(); 
daMain.Fill(ds1, "Maincate"); 

DataTable dt = ds1.Tables["MAINCATE"]; 
foreach (DataRow dr in dt.Rows) 
{ 
    List<string> SubCats = new List<string> { 
    dr["Subcat1"].ToString(), 
    dr["Subcat2"].ToString(), 
    dr["Subcat3"].ToString(), 
    dr["Subcat4"].ToString() 
    }; 
allRecords.Add(dr["mainCate"].ToString(),SubCats); 
mainCatU.Items.Add(dr["mainCate"].ToString()); 
} 

mainCatU.DropDownStyle = ComboBoxStyle.DropDownList; 
mainCatU.Enabled = true; 

然後,你需要處理mainCatU的SelectionChanged是這樣的:

if(allRecords.ContainsKey(mainCatU.SelectedItem.ToString())) { 
    subCatU.DataSource = allRecords[mainCatU.SelectedItem.ToString()]; 
} 
+0

我會嘗試這個..等一下.. :) –

+0

我得到一個錯誤 - 參數1:不能從「對象」轉換爲「字符串' –

+0

所有的錯誤來自這裏... dr [「SubcCat1」],dr [「SubcCat2」],dr [「SubcCat3」],dr [「SubcCat4」], }; allRecords.Add(dr [「mainCate」],SubCats); –

1

我覺得這是你找什麼:

用您當前的代碼填充第一個組合框。

然後要填充第二個組合框,您需要連接第一個組合框selectionchangecommitted。但是,爲什麼不只是使用標準事件呢?

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     //Here use if statements to capture what value is set 
     if (comboBox1.SelectedIndex = 1) 
     //If selected value is Vehicles 
     { 
      //Then SELECT * FROM MainCate WHERE MainCate = 'Vehicles' 
      //This is possibly incorrect as I don't know how your DBTable is structured 

      //Same code as before 
      //Set this data to the second combobox 
     } 
    } 

好嗎?因此,尋找到實現這一點,如果你想重構這個你可以,而不是使用IF語句,你可以parametrise -

string result = comboBox1.SelectedItem.ToString(); 

SELECT * FROM MainCate WHERE MainCate = result 

顯然,這將無法編譯,所以不要複製粘貼,然後回來說它不起作用。它需要像以前一樣執行,但不是每次都硬編碼結果,請使用參數。

就我個人而言,我不會在一個班級擁有這一切,但是您可能更喜歡這種方式。

+0

我做了這樣的..但是這不工作.. (在頁面加載) 串result = mainCatU.SelectedItem.ToString(); SqlDataAdapter daSub = new SqlDataAdapter(「SELECT * FROM MAINCATE where mainCate =」+ result,conn); ds2 = new DataSet(); daSub.Fill(ds2,「Subcate」); subCatU.DisplayMember =「Subcat1」; subCatU.ValueMember =「Subcat1」; subCatU.DataSource = ds1.Tables [「MAINCATE」]; subCatU.DropDownStyle = ComboBoxStyle.DropDownList; subCatU.Enabled = true; –

+0

我已經更新了我的問題,好讓你能看到這個代碼.. –

-1

ComboBox1,ComboBox2 - 你只是想填充ComboBox2使用ComboBox1選擇更改。所以,首先綁定你的ComboBox1。然後cretae事件對於ComboBox:

private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e) 
       { 
        string value1 = ComboBox1 .SelectedValue.ToString(); 
        LoadComboBox2();   
       } 

,讓你的ComboBox1選擇的值,並用它來填充ComboBox2。

private void LoadComboBox2() 
     { 
      DataRow dr; 

      SqlConnection con = new SqlConnection(@"Data Source=name;Initial Catalog=dbName;User ID=sa;Password=sa123"); 
      con.Open(); 
      SqlCommand cmd = new SqlCommand("select id,name from table where [email protected]", con); 
      SqlDataAdapter sda = new SqlDataAdapter(cmd); 
      DataTable dt = new DataTable(); 
      sda.Fill(dt); 

      dr = dt.NewRow(); 
      dr.ItemArray = new object[] { 0, "--Select--" }; 
      dt.Rows.InsertAt(dr, 0); 

      ComboBox2 .ValueMember = "ID"; 

      ComboBox2 .DisplayMember = "Name"; 
      ComboBox2 .DataSource = dt; 
      con.Close(); 

     } 
+0

夥計..停止壞死..這是4年前。 .. –

+0

那又如何?我仍然在使用這.... –