如何设置默认组合框
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
应设置为从0
到Items.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 不是很友好。您也可以只记住最初向控件添加项目时的索引。 您的解释似乎不正确。看我的回答:)以上是关于如何设置默认组合框的主要内容,如果未能解决你的问题,请参考以下文章
将 Microsoft Access 组合框中的默认值设置为当前月份