【问题标题】:ComboBox doubling in values c#ComboBox的值加倍c#
【发布时间】:2012-08-31 15:26:33
【问题描述】:

我有以下代码:

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。但这似乎不是一个好的编码习惯。

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

【问题讨论】:

  • 几乎明白了。清除组合之前,而不是之后。
  • 您是否在页面加载时将值加载到组合框中?如果是这样,请参阅下面的答案...

标签: c# 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); 
} 

【讨论】:

    【解决方案2】:

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

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

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

    comboBox.DataSource = names;
    

    【讨论】:

    • 应该使用 DataSource 而不是项目的任何特殊原因?
    • @NoviceMe, DataSource 当然是另一种选择,通常在结合显示名称和值名称字段绑定到复杂对象时使用。在幕后,它仍然使用显示字段根据复杂对象生成Items 列表,但在为您提供SelectedValue 时会以不同的方式使用它,因为它会从复杂对象中提取值。
    • @NoviceMe,DataSource 为您提供更多灵活性。您可以绑定任何对象,如 List、Dictionary、自定义类等,并将此对象的特定成员用作 DisplayMember,将另一个成员用作 ValueMember。例如:how to bind a list to a combobox? (Winforms)
    【解决方案3】:

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

    示例:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多