C# 在ComboBox数据源中具有初始空白项

C# 在ComboBox数据源中具有初始空白项,c#,winforms,data-binding,combobox,C#,Winforms,Data Binding,Combobox,我有一个组合框,它使用列表作为数据源。由于我最初希望所选的组合框项为空,因此我在列表的开头添加了一个空行,一旦出现第一个SelectedIndexChanged,我就想删除它 问题是,一旦添加,我可以再次删除空白项目。它似乎已从数据源中删除(使用Console.WriteLine(DataSourceList[0].ToString());),但它仍然是组合框中的一个选项。我到底做错了什么 初始绑定 // Set the data source + 1 blank spot cboDropDow

我有一个
组合框
,它使用列表作为
数据源
。由于我最初希望所选的
组合框
项为空,因此我在列表的开头添加了一个空行,一旦出现第一个
SelectedIndexChanged
,我就想删除它

问题是,一旦添加,我可以再次删除空白项目。它似乎已从
数据源中删除(使用
Console.WriteLine(DataSourceList[0].ToString());
),但它仍然是
组合框中的一个选项。我到底做错了什么

初始绑定

// 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;
    }
}

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

我终于想出了一个解决方案。它需要两个结构变化:

  • 使用
    BindingList
    而不是
    List
  • 使用绑定过程中未调用的事件(我使用了
    \u下拉列表
  • 因此,在创建列表时,添加一个空白项(
    .Insert()
    也可以):


    Winforms combobox没有数据绑定问题似乎与绑定过程本身调用
    SelectedIndexChanged
    有关。当用户更改为ComboBox时,我希望第一次调用它。
    BindingList<String> ComboOpts = new BindingList<String>();
    comboOpts.Add(String.Empty);
    comboOpts.Add("Option 1");
    comboOpts.Add("Option 2");
    comboOpts.Add("Option 3");
    
    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);                       
    }