1

我需要在组合框中显示诸如“偷偷摸摸”和“谨慎”之类的值,但此后能够根据这些词的基础 DB 值(例如,“S”和“D”)设置组合框的 SelectedItem。

我认为我可以以某种方式使用组合框的 DisplayMember 和 ValueMember 属性,但是我随后可以使用实际(valuemember)值做一些类似于以下内容的事情:

comboBoxAdverbs.SelectedIndex = comboBoxAdverbs.Items.IndexOf(weirdAdverbs[CURRENT_ADVERB]);

由于“weirdAdverbs[CURRENT_ADVERB]”包含“S”和“D”之类的值,当组合框包含“偷偷摸摸”和“谨慎”的值时,它当然不会找到并设置 SelectedIndex

如果我将组合框项目标记值设置为“S”和“D”(假设这是可能的),我可以遍历这些值,但我希望有一种类似于“IndexOf() “ 多于。

4

3 回答 3

3

我为此使用了一个模板类,它非常方便。组合框将显示您想要的任何文本,您可以使用它存储一个值。

    public class cboItem<T>
{
    public cboItem(string name, T value)
    {
        this.Name = name;
        this.Value = value;
    }

    public string Name { get; set; }
    public T Value { get; set; }
    public override string ToString()
    {
        return Name == null ? "" : Name;
    }
}
于 2012-07-17T01:10:59.127 回答
2

组合框项目可以是任何东西,包括类/结构。默认情况下,它将使用 ToString() 实现来显示项目,但是如果您填充一组对象,您可以使用 DisplayMember 和 ValueMember 来获得很好的效果。

作为一个简单的例子,给你一些想法,我们将组合框绑定到一组 KeyValuePair 实例,用于你奇怪的动词代码及其描述性名称。或者,您可以使用 linq 组合匿名类型,或创建自己合适的类/结构。

private void populateCombo()
{
    comboBoxAdverbs.Items.Clear();
    comboBoxAdverbs.Items.Add( new Tuple<string, string>( "S", "Surreptitiously" ) );
    comboBoxAdverbs.Items.Add( new Tuple<string, string>( "D", "Discreetly" ) );
    comboBoxAdverbs.DisplayMember = "Item2";
}

然后在您要选择与提供的代码匹配的项目的代码中:(即“D”)

var item = comboBoxAdverbs.Items
    .OfType<Tuple<string,string>>()
    .FirstOrDefault(i => string.Compare(i.Item1, textBox1.Text, true) == 0);

if (item != null)
    comboBoxAdverbs.SelectedItem = item;

这会尝试通过将键与任何输入(在本例中为文本框值)进行比较来找到匹配项,如果找到匹配项,则设置 SelectedItem 以告诉组合框选择它。

** 编辑:Whups,最初使用 KeyValuePair,我没有意识到它是一个结构,所以没有 Null 检查能力。改为元组(本质上是对)

于 2012-07-17T01:12:34.133 回答
0

我发现对我有用的是在设置后将 selectedindex 值存储到组合框的 Tag 属性中。然后,如果用户在应该处于“只读”状态时尝试更改 selectedIndex,只需将其更改回存储在 Tag 属性中的 selectedIndex 值:

comboBoxPlatypusId.SelectedIndex = comboBoxPlatypusId.Items.IndexOf(DuckbillVals[Duckbill_PlatypusID]);
comboBoxPlatypusId.Tag = comboBoxPlatypusId.SelectedIndex;
...
private void comboBoxFunnyMammals_SelectedValueChanged(object sender, EventArgs e) {
    var cb = sender as ComboBox;
    if (cb != null)
    {
        int validSelection = Convert.ToInt32(cb.Tag);
        if (cb.SelectedIndex != validSelection) {
            cb.SelectedIndex = validSelection;
        }
    }
}
于 2012-07-18T23:19:11.753 回答