winforms 从下拉列表中选择项目时是否更改组合框的文本字段?

oipij1gg  于 2023-01-05  发布在  其他
关注(0)|答案(3)|浏览(106)

我在窗体上有一个ComboBox,ComboBox的DropDownStyle属性设置为DropDown,这样用户就可以从下拉列表中选择一个项目或手动键入一些文本。
当用户从下拉列表中选择一个项目时,我希望在项目出现在ComboBox的文本字段之前对项目的文本进行一些更改。为了使用一个非常简单的示例,假设下拉列表包含由ID和描述组成的项目,如下所示:

101 Cat
102 Dog
103 Bird

当选择其中一项时,我希望ComboBox的文本字段中只显示描述,因此当选择“102 Dog”时,文本字段中应显示字符串“Dog”,用户可随时对其进行编辑,下拉列表中的项应保持不变。
我以为我可以只监听ComboBox的SelectionChangeCommitted事件,然后将ComboBox的Text属性设置为我喜欢的任何值,但是如果我这样做,我对Text所做的更改将被忽略,整个字符串(“102 Dog”)仍然显示在ComboBox中。
所以我想我也应该把SelectedIndex字段更新为-1,以向ComboBox表明我设置的Text不是下拉列表中的一个项,但这只是完全清除了文本字段,而不管我把Text属性更改为什么。
所以我认为SelectionChangedCommitted是错误的事件,因为它触发得太快了(Text属性似乎只有在SelectionChangeCommitted事件处理程序完成后才用我的选择更新),但所有其他ComboBox事件也无法工作,包括SelectedIndexChangedDropDownClosed
我认为这是很容易实现的。一定有一个简单的方法来实现它,我肯定我错过了一些明显的东西...有什么想法吗?

ux6nzvsh

ux6nzvsh1#

你可以试试这个:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
  if (comboBox1.SelectedIndex > -1)
  {
    string value = comboBox1.Items[comboBox1.SelectedIndex].ToString().Substring(4);
    this.BeginInvoke((MethodInvoker)delegate { this.comboBox1.Text = value; });
  }
}
hgc7kmma

hgc7kmma2#

澄清一下,当用户下拉组合键时,你是否显示了“101猫”、“102狗”等?当用户选择组合键时,你是否显示了它们?101是“猫”的键,102是“狗”的键,等等?如果是的话,你为什么要显示它们,而不仅仅是显示每一项的文本(如果这是您的要求,请原谅我的回答).根据我的理解,我将把combobox valuemember配置为返回101、102等的属性,并把displaymember配置为返回每个条目文本的属性,这样,你已经得到了你想要的,例如显示“猫”,“狗”和“鸟”的文本。另外,如果你想要进一步的处理,你可以附加一个事件到组合的TextChanged事件。

ryevplcw

ryevplcw3#

以上解决方案都很好用,但是当您想使用“DropDownList”样式时就不行了--这是我的要求,所以我设计了其他的样式
注意:下面的代码在两种字符串格式中都有相同的类反射。你可以用字典查找来完成,然后用.keys和.values来填充,两种方法都可以。
事件代码

private bool activateCombobox = false;
private void myComboBox_DropDown(object sender, EventArgs e)
{
    Foo.IsDroppedDown = true;
        myComboBox.Items.Clear();
        myComboBox.Items.AddRange(fooItems);
    Foo.IsDroppedDown = false;
    activateCombobox = true;
}

private void myComboBox_SelectedValueChanged(object sender, EventArgs e)
{
    if (activateCombobox)
    {
        activateCombobox = false;
        var selectedItem = myComboBox.SelectedItem;
        myComboBox.Items.Clear();
        myComboBox.Items.AddRange(fooItems);
        myComboBox.SelectedItem = selectedItem;
    }
        
}

然后是我们的类代码(把它改成你的类ofc,这只是一个例子)

private Foo[] fooItems = new Foo[] { new Foo(1), new Foo(2), new Foo(3) };
private class Foo
{
    public int index = 0;
    public Foo() { }
    public Foo(int index) { this.index = index; }
    public string dropdownFoo { get { return $"Foo{index}"; } }
    public string displayFoo { get { return $"Bar{index}"; } }
    public override string ToString()
    {
        if (IsDroppedDown)
            return dropdownFoo;
        return displayFoo;
    }
    public static bool IsDroppedDown = false;
}

相关问题