当从下拉列表中选择项目时,更改ComboBox's文本字段

本文关键字:ComboBox 字段 文本 更改 下拉列表 选择 项目 | 更新日期: 2023-09-27 18:08:18

在表单上有一个组合框。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,以指示组合框,我设置的Text不是下拉列表中的一个项目。但这只是完全清除文本字段,无论我将Text属性更改为什么。

所以我认为SelectionChangedCommitted是错误的事件要使用,因为它似乎对我的目的来说太快了(Text属性似乎只在 SelectionChangeCommitted事件处理程序完成后用我的选择更新)。但所有其他ComboBox事件也无法工作,包括SelectedIndexChangedDropDownClosed

我认为这将是相当微不足道的实现。一定有一种简单的方法可以做到这一点,我肯定我错过了一些明显的东西……什么好主意吗?

当从下拉列表中选择项目时,更改ComboBox's文本字段

你可以试试:

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; });
  }
}

只是澄清一下,当用户下拉组合并在选中时显示它们时,您是否显示"101 Cat", "102 Dog"等?101是"猫"的键,102是"狗"的键,等等?如果是这样,为什么要显示它们而不是只显示每个项目的文本(如果这是您的要求,请向我的回答道歉)。根据我的理解,我将把combobox valumember配置为返回101、102等的属性,把displaymember配置为返回每个条目文本的属性。这样,你就会得到你想要的,即显示"猫","狗"answers"鸟"的文本。此外,如果需要进一步处理,还可以将事件附加到组合的TextChanged事件。

上面的解决方案都很有效,但是当你想使用'DropDownList'样式时就失败了——这是我的要求,所以我过度设计了其他的

注意:下面的代码在两种字符串格式中都有相同的类。您可以使用字典查找并填充。keys和。values,这两种方法都可以。

EventCode

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;
}