编程将选定项目附加到其文本框的ComboBox

时间:2010-01-01 13:44:12

标签: .net winforms combobox

这是我在上一个项目中必须处理的一个问题,虽然我找到了一个有效的解决方案,但我对此并不满意,并且想知道是否会有更好,更清洁的问题。

问题:

基本上,我需要实现一个ComboBox,将一个项目(从下拉列表中选择)插入或附加到文本框而不是替换中的所有文本文本框:

  • 如果文本框中选择了某些文本,则该选择将替换为从下拉列表中选择的项目;
  • 如果文本框未选中任何文本,则从下拉列表中选择的项目将附加在文本框字段中。

事实证明,我无法通过处理ComboBox的事件(例如SelectedIndexChangedSelectionChangeCommittedTextChanged等)来实现此行为。)因为ComboBox控件最终会将文本框字段与下拉列表中的所选项同步,而不会在之后引发任何其他事件。

解决方案,a.k.a丑陋的黑客:

我最终安装了一个Timer,一旦过期,就会导致对文本框字段进行更新。计时器设置为约。 30毫秒,这应该足够长,以确保所有事件(SelectedIndexChangedTextUpdate等)都已处理完毕,并且足够短,以至于不会感觉到用户明显滞后。

有谁知道这个问题更清洁的解决方案?

2 个答案:

答案 0 :(得分:2)

我相信你已经知道这一点了,但我在这里重复一下,让你考虑一下这个含义。组合框是一种相对复杂的控件,由更简单的组件以预定义的方式交互组成。文本框,列表框和按钮组合在一起创建一个控件,旨在简化为简化文本输入和选择提供紧凑UI的常用方法。

看起来你的情况并不像组合框设计它们那样适合这些组件的预定义交互。因此,我的建议是分别创建文本框,列表框和按钮,并手动定义它们的交互方式,而不是试图对抗组合框的预定义行为。

答案 1 :(得分:1)

你想要的不是ComboBox。您需要一个文本框和一个按钮,单击该按钮可以为您提供可以插入文本框的标记下拉列表。 ComboBox 几乎为您提供了这个但不适合有两个原因:

  • 用户知道ComboBoxes如何工作。您的组件看起来像ComboBox但不像一个组件。这只会引起混淆。
  • ComboBoxes的设计方式使用户始终能够了解它们的工作原理并熟悉它们。并不是所选项目与文本不同。你不能覆盖这种行为,因为如果你这样做,它将不再是我们所知道的ComboBox。试图覆盖它以完全改变控件的行为,而不是设计它的方式会导致难以修复的问题。

您应该编写一个自定义控件来实现您需要的功能,并且具有更好地代表您正在执行的操作的UI。要寻找灵感,您可以考虑许多即时消息程序所具有的“插入表情符号”UI。请注意,该按钮通常不在文本框内,而是一个完全独立的按钮。