代码之家  ›  专栏  ›  技术社区  ›  stakx - no longer contributing Saravana Kumar

编程将选定项附加到其文本框的组合框

  •  0
  • stakx - no longer contributing Saravana Kumar  · 技术社区  · 15 年前

    这是我在上一个项目中必须处理的一个问题,尽管我找到了一个有效的解决方案,但我对它不太满意,我想知道是否会有一个更好、更干净的解决方案。

    问题:

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

    • 如果文本框选择了某些文本,则该选择将替换为从下拉列表中选择的项目;
    • 如果文本框没有选择文本,则从下拉列表中选择的项目将追加到文本框字段中。

    事实证明,我无法通过处理 ComboBox 的事件(例如 SelectedIndexChanged , SelectionChangeCommitted , TextChanged 等等),因为 组合框 控件将最终使文本框字段与下拉列表中的选定项同步,而不会在此后引发任何进一步的事件。

    解决方案,A.K.A丑陋的黑客:

    我最后安装了一个 Timer 一旦过期,就会更新文本框字段。计时器设置为约30 ms,其长度应足以确保所有事件( 选择的索引已更改 , TextUpdate 已经处理过了,而且足够短,不会给用户造成明显的延迟。

    有人知道解决这个问题的更清洁的方法吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Mark Byers    15 年前

    你要的不是组合框。您需要一个文本框和一个按钮,当单击它时,它会给您一个可以插入到文本框中的令牌下拉列表。组合框 几乎 给你这个,但不适合有两个原因:

    • 用户知道组合框的工作方式。您的组件看起来像一个组合框,但行为却不像一个。那只会引起混乱。
    • 组合框是按照它们的设计方式设计的,这样用户就可以随时了解它们的工作方式并熟悉它们。并不意味着所选项目与文本不同。您不能重写此行为,因为如果您这样做了,它将不再是我们所知道的组合框。试图重写它以完全改变控件的行为,而这种方式不是为其设计的,这会导致不容易修复的问题。

    您应该编写一个自定义控件,该控件实现您需要的功能,并具有一个更好地表示您正在做什么的UI。为了寻找灵感,你可以考虑使用许多即时消息程序提供的“插入表情”用户界面。请注意,该按钮通常不在文本框内,而是完全独立的按钮。

        2
  •  2
  •   BlueMonkMN    15 年前

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

    似乎您的案例本身并不适合于这些组件的预定义交互,就像组合框设计它们的方式一样。因此,我的建议是单独创建文本框、列表框和按钮,并手动定义它们的交互方式,而不是尝试对抗组合框的预定义行为。