如何设置默认组合框

Posted

技术标签:

【中文标题】如何设置默认组合框【英文标题】: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 课程吗? 【参考方案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 不是很友好。您也可以只记住最初向控件添加项目时的索引。 您的解释似乎不正确。看我的回答:)

以上是关于如何设置默认组合框的主要内容,如果未能解决你的问题,请参考以下文章

Kendo Ui 组合框 - 设置默认值

更改所有表单上所有组合框对象的设置

将 Microsoft Access 组合框中的默认值设置为当前月份

WPF 组合框 - 选择第一项作为默认值

如何在 vb.net 中将 datagridview 单元格样式从默认文本框更改为组合框?

如何在组合框中将项目设置为选中