C# 值c中的组合框加倍#

C# 值c中的组合框加倍#,c#,combobox,C#,Combobox,我有以下代码: private void nameTextBox_Leave(object sender, EventArgs e) { var names = ConfigurationManager.AppSettings.AllKeys .Where(k => k.StartsWith("name")) .ToArray(); // A

我有以下代码:

private void nameTextBox_Leave(object sender, EventArgs e)
{                  
    var names = ConfigurationManager.AppSettings.AllKeys
                        .Where(k => k.StartsWith("name"))
                        .ToArray();

    // Add names to combobox
    comboBox.Items.AddRange(names);
}
问题是每次我按文本框中的Tab键时,comboBox元素都会加倍。如果里面有肯、约翰、蒂姆,如果我再按tab键,就会显示两次

我尝试在上面的名称中使用distinct,但这并没有起到任何作用,因为每次都会创建新实例,并保存上一个实例。我不能在添加名称后立即将comboBox设为空,因为它正在代码中的按钮单击中使用

我认为唯一的选择是声明一个全局变量,并确保其值为0 然后只在comboBox中插入值,并在插入值后将其更改为1。但这似乎不是一个好的编码实践


是否有更好的方法来完成此操作?

AddRange
之前添加
comboBox.Items.Clear()
。所以整个街区都应该是这样

private void nameTextBox_Leave(object sender, EventArgs e) 
{                   
    var names = ConfigurationManager.AppSettings.AllKeys 
                        .Where(k => k.StartsWith("name")) 
                        .ToArray(); 

    // Add names to combobox 
    comboBox.Items.Clear();
    comboBox.Items.AddRange(names); 
} 

我不确定我是否完全理解,但是为什么你不能在填充之前清除这些项呢

comboBox.Items.Clear()
comboBox.Items.AddRange(names);
您也可以尝试不使用项,而是使用数据源:

comboBox.DataSource = names;

首先清除组合框的建议应该可以解决您的问题,但是如果您也在页面加载中加载组合框,那么我认为这不是最好的解决方案(只是掩盖了真正的问题)。如果要在页面加载时填充组合框,请在其中添加页面。IsPostBack签入:

例如:

if(!Page.IsPostBack)
{
    //Populate the initial values into the combobox
}

如果您没有,那么清晰的解决方案应该很好。

您几乎就找到了。在之前而不是之后清除组合框。是否在页面加载时将值加载到组合框中?如果是这样的话,请参见下面我的答案……为什么应该使用DataSource而不是items?有什么特别的原因吗?@NearoMe,
DataSource
当然是另一个选项,通常在绑定到复杂对象以及显示名称和值名称字段时使用。在封面下,它仍然使用显示字段根据复杂对象生成一个
项目列表
,但在提供
SelectedValue
时使用它的方式不同,因为它从复杂对象中提取值。@novelme,DataSource为您提供了更大的灵活性。您可以绑定任何对象,如List、Dictionary、custom类等,并将此对象的特定成员用作DisplayMember,将另一个成员用作ValueMember。例如: