2012-09-11 33 views
1

我正在使用具有多個組合框的Windows窗體。根據第一個組合框中選擇的內容決定哪些項目被填充到第二個組合框中。我遇到的問題是,如果我在ComboBox1中選擇了ChoiceA,ComboBox2是clear()ed,然後充滿了ChoiceX,ChoiceY和ChoiceZ。然後我在ComboBox1中選擇ChoiceB,ComboBox2是clear()ed,但是沒有選擇要添加到ComboBox2,所以它應該保持爲空。問題是,在選擇了ChoiceB之後,在ComboBox2中有一個大的白盒子,有三個空插槽。因此,基本上,無論多少項都被清除N,這就是選擇ChoiceB後出現多少個空插槽。Windows Form Combobox.Items.Clear()留下空插槽

這可能有點混亂,我希望我解釋得不錯。

- 編輯添加代碼,希望它有助於清理事情。順便說一句,mainItemInfo是另一個「viewmodel」類型的類。它重新接入表單進行更新。

private void cmbType_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     DropDownItem item = (DropDownItem)cmbType.SelectedItem; 
     if (!String.IsNullOrWhiteSpace(item.Text)) 
     { 
      cmbBrand.Enabled = true; 
      btnAddBrand.Enabled = true; 

      mainItemInfo.FillBrands(new Dictionary<string, string> { { "Type", item.Text } }); 
      mainItemInfo.SyncBrands(this); 
     } 
    } 

public void FillBrands(Dictionary<string, string> columnsWhere) 
    { 
     // Clear list 
     Brands.Clear(); 
     // Get data 
     StorageData storage = new StorageData(File.ReadAllLines(ItemsFilePath)); 
     // Fill Brands 
     foreach (string type in storage.GetDistinctWhere(columnsWhere, "Brand")) 
     { 
      Brands.Add(type, new DropDownItem(type, type)); 
     } 
    } 

public void SyncBrands(IPopupItemInfo form) 
    { 
     form.ClearcmbBrand(); 
     var brands = from brand in Brands.Keys 
        orderby Brands[brand].Text ascending 
        select brand; 
     foreach (var brand in brands) 
     { 
      form.AddTocmbBrand(Brands[brand]); 
     } 
    } 

public void AddTocmbBrand(DropDownItem brand) 
    { 
     cmbBrand.Items.Add(brand); 
    } 

    public void ClearcmbBrand() 
    { 
     cmbBrand.Items.Clear(); 
    } 
+1

我承認我被迷惑,在事件處理程序添加代碼組合1對你的問題。 –

回答

1

我能夠修復額外的空間。我改變了添加和清除方法:

public void AddTocmbModel(DropDownItem model) 
    { 
     cmbModel.Items.Add(model); 
     cmbModel.DropDownHeight = cmbModel.ItemHeight * (cmbModel.Items.Count + 1); 
    } 

    public void ClearcmbModel() 
    { 
     cmbModel.Items.Clear(); 
     cmbModel.DropDownHeight = cmbModel.ItemHeight; 
    } 
1

你應該能夠設置listbox2的數據源爲null以清除它,然後用新的數據再進行設置。

所以,在僞代碼,類似:

ItemSelectedInListBox1() 
{ 
    List futureListbox2Items = LoadOptionsBaseOnSelectedItem(item) 

    Listbox2.Datasource = null 
    Listbox2.Datasource = futureListBox2Items 
} 

這應該刷新不帶空格顯示Listbox2項目列表。

+0

感謝您的建議,但這也沒有奏效。我仍然得到額外的空插槽。 – ScubaSteve

+0

嗯。對不起,沒有幫助。我唯一能想到的就是發送的項目的初始列表有一些空的值。 –

+0

那麼,爲了確保,我在public void SyncBrands(IPopupItemInfo表單)中的foreach行上放置了一個斷點,並在清除後將它添加到組合框中。它實際上不會添加任何東西。 – ScubaSteve

0

簡單地說,你可以添加一個項目,然後再清除組合框:

cmbBrand.Items.Clear(); 
    cmbBrand.Items.Add(DBNull.Value); 
    cmbBrand.Items.Clear();