2

我有以下代码:

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从文本框中按下时,组合框元素都会加倍。如果里面有Ken、John、Tim,如果我再次按 Tab,它会显示两次。

我尝试在上面的名称中使用 distinct ,但这并没有做任何事情,因为每次都会创建新的实例并保存以前的实例。我不能在添加名称后立即使组合框为空,因为它在代码中单击后面的按钮中使用。

我认为唯一的替代方法是声明一个全局变量并确保其值为 0,然后仅在组合框中插入值,并在插入值后将其更改为 1。但这似乎不是一个好的编码习惯。

有没有更好的方法来完成这项工作?

4

3 回答 3

6

在. comboBox.Items.Clear()_ AddRange所以整个区块应该是。

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); 
} 
于 2012-09-06T18:39:19.663 回答
1

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

comboBox.Items.Clear()
comboBox.Items.AddRange(names);

您也可以尝试不使用 Items,而是使用 DataSource:

comboBox.DataSource = names;
于 2012-09-06T18:46:03.267 回答
0

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

例子:

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

如果你不是那么清晰的解决方案应该没问题。

于 2012-09-06T18:50:54.037 回答