【问题标题】:How to Set default combobox如何设置默认组合框
【发布时间】:2013-01-13 10:33:44
【问题描述】:

所以我一直在寻找为我的组合框设置一个默认值。我发现了一些东西,但它们似乎都不起作用。

实际上,如果我创建一个简单的组合框并使用comboBox1.SelectedIndex = comboBox1.Items.IndexOf("something"),它就可以工作,但是一旦我动态生成组合框的内容,我就无法再让它工作了。

这就是我填充组合框的方式(位于类的构造函数中);

        string command = "SELECT category_id, name FROM CATEGORY ORDER BY name";
        List<string[]> list = database.Select(command, false);

        cbxCategory.Items.Clear();

        foreach (string[] result in list)
        {
            cbxCategory.Items.Add(new ComboBoxItem(result[1], result[0]));
        }

我似乎无法让它设置一个默认值,比如如果我将cbxCategory.SelectedIndex = cbxCategory.Items.IndexOf("New") 放在上面的代码下面,它就不起作用了。

顺便说一句,WinForms。

提前谢谢你。

【问题讨论】:

  • WPF?窗体?请注明!在标签、标题或问题中。
  • 您是否有调试器来检查该值是否设置为有效索引(即不是 -1 等)?如果是,您可能只需要调用 cbxCategory.Refresh()
  • SelectedIndex 应该可以正常工作。正如答案所建议的那样,请确保您要查找的内容确实存在...否则我建议使用固定数字而不是搜索。
  • 遗憾的是,固定数字不是一个选项。我将运行调试。
  • 您能分享一下您的ComboBoxItem 课程吗?

标签: c# winforms combobox populate


【解决方案1】:

我的解决方案:

int? defaultID = null;
foreach (DataRow dr in dataSource.Tables["DataTableName"].Rows)
{
     if ((dr["Name"] != DBNull.Value) && ((string)dr["Name"] == "Default Name"))
     {
          defaultID = (int)dr["ID"];
     }
}
if (defaultID != null) comboBox.SelectedValue = defaultID;

【讨论】:

    【解决方案2】:

    cbxCategory.SelectedIndex 应设置为从0Items.Count-1 的整数,如

    cbxCategory.SelectedIndex  = 2;
    

    你的

     cbxCategory.SelectedIndex = cbxCategory.Items.IndexOf("New") 
    

    只要没有 ComboboxItem 匹配字符串(“New”),就应该返回 -1;

    虽然我不太喜欢它,但另一种解决方案是

    foreach(object obj in cbxCategory.Items){ 
        String[2] objArray = (String[])obj ;
        if(objArray[1] == "New"){
           cbxCategory.SelectedItem = obj;
           break; 
        }
    }
    

    也许这还需要对您的代码进行以下转换

        foreach (string[] result in list)
        {
          cbxCategory.Items.Add(result);
        }
    

    我没有测试过代码,我不确定转换为 String[2] 但类似的东西应该可以工作

    【讨论】:

    • 我不知道我的默认项目将是什么索引,因为组合框是用数据库中的数据填充的。因此我必须使用 IndexOf (或类似于匹配值的东西)。如果我将项目静态添加到下拉列表而不是从数据库中加载它们,它会起作用 - 但每当我从数据库中加载它们时,它就无法以某种方式工作。
    • 加载后设置 cbxCategory.SelectedIndex = 0;
    【解决方案3】:

    这是我的简单解决方案

            var list = comboBox1.Items.Cast<string>().ToList();
            cbxCategory.SelectedIndex = list.FindIndex(c => c.StartsWith("test"));
    

    【讨论】:

    • 此解决方案将导致 InvalidCastException,因为 ComboBoxItem(可能是自定义类,因为它不是 Windows 窗体的一部分)无法转换为字符串。
    • 是的,如果 OP 将提供他的 Custom ComboBox 会更好 :D 因为我们专注于默认 ComboBox
    【解决方案4】:

    您可以使用 LINQ。

    //string command = "SELECT category_id, name FROM CATEGORY ORDER BY name";
    //List<string[]> list = database.Select(command, false);
    // sample data...
    List<string[]> list = new List<string[]> { new string[] { "aaa", "bbb" }, new string[] { "ccc", "ddd" } };
    
    cbxCategory.Items.Clear();
    
    foreach (string[] result in list)
    {
        cbxCategory.Items.Add(new ComboBoxItem(result[1], result[0]));
    }
    
    ComboBoxItem tmp = cbxCategory.Items.OfType<ComboBoxItem>().Where(x => x.ResultFirst == "bbb").FirstOrDefault();
    if (tmp != null)
        cbxCategory.SelectedIndex = cbxCategory.Items.IndexOf(tmp);
    

    ComboBoxItem类:

    class ComboBoxItem
    {
        public string ResultFirst { get; set; }
        public string ResultSecond { get; set; }
    
        public ComboBoxItem(string first, string second)
        {
            ResultFirst = first;
            ResultSecond = second;
        }
    }
    

    【讨论】:

      【解决方案5】:

      看起来您正在 cbxCategory.Items 集合中搜索字符串,但它包含 ComboBoxItem 类型的项目。因此搜索将返回 -1。

      【讨论】:

      • 你是绝对正确的。你会建议如何搜索它?
      • ComboBoxItem 不是 System.Windows.Forms 命名空间中的类(你确定这是 WinForms 吗?);因为它似乎是自定义类,所以我无法为您提供确切的搜索代码,因为您没有提供属性名称。您只需要遍历集合即可找到正确的项目。不幸的是 ComboBox.ObjectCollection 对 LINQ 不是很友好。您也可以只记住最初向控件添加项目时的索引。
      • 您的解释似乎不正确。看我的回答:)
      猜你喜欢
      • 2017-10-03
      • 2014-02-15
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      相关资源
      最近更新 更多