在ComboBox DataSource中有一个最初为空的项目

时间:2017-06-09 12:20:28

标签: c# winforms data-binding combobox

我有一个ComboBox,它使用列表作为DataSource。由于我最初希望选定的ComboBox项为空,我在列表的开头添加一个空行,然后在第一个SelectedIndexChanged出现后删除该行。

问题是,一旦添加,我可以设法再次移除空白项目。它似乎已从DataSource中删除(使用Console.WriteLine(DataSourceList[0].ToString());进行测试),但它仍然是ComboBox中的一个选项。鸭子我做错了什么?

初始绑定

// Set the data source + 1 blank spot
cboDropDown.DataSource = viewModel.dataList;
viewModel.dataList.Insert(0, String.Empty);

// Bind the selected value
Binding bindSelItem = new Binding("SelectedItem", viewModel, "selectedItem");
cboDropDown.DataBindings.Add(bindSelItem);

所选索引已更改

private void cboDropDown_SelectedIndexChanged(object sender, EventArgs e)
{
    // Write the first element to the console (debug purpose)
    Console.WriteLine("First element is: " + viewModel.dataList[0].ToString());

    // If the first element is blank, remove and reset datasource
    if (viewModel.dataList[0].ToString() == String.Empty)
    {
        // Remove item at index 0
        viewModel.dataList.RemoveAt(0);

        // Write to console to confirm that it is removed
        Console.WriteLine("First element is: " + viewModel.dataList[0].ToString());

        // Reset data source for ComboBox
        cboDropDown.DataSource = viewModel.dataList;
    }
}

2 个答案:

答案 0 :(得分:0)

更改数据源后,您需要DataBind() DropDownList。

答案 1 :(得分:0)

我终于找到了解决方案。它需要两个结构变化:

  1. 使用BindingList<T>而不是List<T>
  2. 使用未在绑定过程中调用的事件(我使用_DropDown
  3. 因此,在创建列表时添加空白项目(.Insert()也可以):

    BindingList<String> ComboOpts = new BindingList<String>();
    comboOpts.Add(String.Empty);
    comboOpts.Add("Option 1");
    comboOpts.Add("Option 2");
    comboOpts.Add("Option 3");
    

    然后在DropDown事件中删除第一个项目(如果它为空)。重新绑定数据源甚至是不必要的(BindingList负责):

    private void cboMyComboBox_DropDown(object sender, EventArgs e)
    {
        // The first time that the combo box is activated, remove the initial item
        if (viewModel.ComboOptions[0].ToString() == String.Empty)
            viewModel.ComboOptions.RemoveAt(0);                       
    }