Windows Form Combobox.Items.Clear () оставляет пустые места

Я работаю над формой Windows с несколькими комбинированными списками. В зависимости от того, что выбрано в первом поле со списком, определяет, какие элементы заполняются во втором поле со списком. Проблема, с которой я сталкиваюсь, заключается в том, что если я выбираю ChoiceA в ComboBox1, ComboBox2 очищается () ed, а затем заполняется ChoiceX, ChoiceY и ChoiceZ. Затем я выбираю ChoiceB в ComboBox1, ComboBox2 очищен (), но нет вариантов для добавления в ComboBox2, поэтому он должен оставаться пустым. Проблема в том, что после выбора ChoiceB в ComboBox2 появляется большое белое поле с тремя пустыми слотами. Итак, в основном, сколько бы элементов не было очищено N, именно столько пустых слотов появляется после выбора варианта B.

Это может немного сбить с толку, надеюсь, я достаточно хорошо объяснил.

- РЕДАКТИРОВАТЬ Добавление кода, надеюсь, это поможет прояснить ситуацию. Кстати, mainItemInfo - это еще один класс типа "модели просмотра". Он возвращается в форму для внесения обновлений.

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

person ScubaSteve    schedule 11.09.2012    source источник
comment
Признаюсь, что запутался, добавьте в свой вопрос код в обработчике событий для комбо 1.   -  person Tony Hopkinson    schedule 11.09.2012


Ответы (3)


Просто вы можете добавить элемент, а затем снова очистить поле со списком:

   cmbBrand.Items.Clear();
   cmbBrand.Items.Add(DBNull.Value);
   cmbBrand.Items.Clear();
person 0xFFFFFF    schedule 03.08.2017

Вы должны установить для источника данных listbox2 значение null, чтобы очистить его, а затем снова установить его с новыми данными.

Итак, в псевдокоде что-то вроде:

ItemSelectedInListBox1()
{
    List futureListbox2Items = LoadOptionsBaseOnSelectedItem(item)

    Listbox2.Datasource = null
    Listbox2.Datasource = futureListBox2Items
}

Это должно обновить список элементов, отображаемых в Listbox2, без пробелов.

person yellow_nimbus    schedule 11.09.2012
comment
Спасибо за предложение, но оно тоже не сработало. Я все еще получаю лишние пустые слоты. - person ScubaSteve; 12.09.2012
comment
Хм. Извините, это не помогло. Единственное, о чем я мог подумать, это то, что в исходном списке отправленных элементов есть некоторые пустые значения. - person yellow_nimbus; 12.09.2012
comment
Ну, чтобы убедиться, я поставил точку останова на строке foreach в общедоступной void SyncBrands (форма IPopupItemInfo), где она добавляется в поле со списком после очистки. Собственно ничего не добавляет. - person ScubaSteve; 12.09.2012
comment
У меня это сработало, но мне пришлось сначала позвонить .Items.Clear(), а затем установить Datasource на null. Выполняя это в таком порядке, вы избавились от пустых белых линий. - person Niall; 16.12.2015

Мне удалось исправить лишнее место. Я изменил методы Add и Clear на:

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;
    }
person ScubaSteve    schedule 12.09.2012