我在窗体上有一个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事件也无法工作,包括SelectedIndexChanged
和DropDownClosed
。
我认为这是很容易实现的。一定有一个简单的方法来实现它,我肯定我错过了一些明显的东西...有什么想法吗?
3条答案
按热度按时间ux6nzvsh1#
你可以试试这个:
hgc7kmma2#
澄清一下,当用户下拉组合键时,你是否显示了“101猫”、“102狗”等?当用户选择组合键时,你是否显示了它们?101是“猫”的键,102是“狗”的键,等等?如果是的话,你为什么要显示它们,而不仅仅是显示每一项的文本(如果这是您的要求,请原谅我的回答).根据我的理解,我将把combobox valuemember配置为返回101、102等的属性,并把displaymember配置为返回每个条目文本的属性,这样,你已经得到了你想要的,例如显示“猫”,“狗”和“鸟”的文本。另外,如果你想要进一步的处理,你可以附加一个事件到组合的TextChanged事件。
ryevplcw3#
以上解决方案都很好用,但是当您想使用“DropDownList”样式时就不行了--这是我的要求,所以我设计了其他的样式
注意:下面的代码在两种字符串格式中都有相同的类反射。你可以用字典查找来完成,然后用.keys和.values来填充,两种方法都可以。
事件代码
然后是我们的类代码(把它改成你的类ofc,这只是一个例子)