【问题标题】:Getting handle of Autocomplete dropdown box of textbox in winforms获取winforms中文本框自动完成下拉框的句柄
【发布时间】:2011-05-01 17:00:49
【问题描述】:

我想调整文本框的自动完成下拉框的宽度。我不想调整该文本框的宽度,而只想调整自动完成下拉菜单。我知道我无法通过使用文本框提供的属性来增加自动完成下拉菜单的宽度。

因此我想知道是否有任何方法可以获取该自动完成框的句柄,然后在不更改文本框宽度的情况下增加该下拉列表的宽度?

如果这不可能,那么我想创建带有自动完成功能的自定义文本框,在这种情况下如何使用微软提供的现有自动完成功能?有没有办法做到这一点。有没有可用的库?

【问题讨论】:

标签: c# winforms autocomplete textbox


【解决方案1】:

我认为你不能使用微软的autocomplete 实现,它没有调整下拉宽度的选项。

创建一个后台线程以不妨碍输入,并连接组合框或文本框的文本更改事件以更新候选列表(假设自动建议模式,因为您提到了下拉菜单)。如果你有一个组合框,你可能可以add/remove the combobox items on the fly。但是对于下拉列表和文本框项目你need a popup window

显示一个弹出窗口很容易,但您不需要使用固定位置,这样当文本框靠近屏幕边缘时它不会离开屏幕。而且焦点逻辑有点复杂。除非用户按箭头键进行选择,否则您需要将注意力集中在文本框上。

所以 当焦点在文本框上时: 箭头键将焦点移动到弹出窗口 其他键如果不由对话框本身处理,则转到文本框,但鼠标悬停在弹出窗口上时的删除键除外。 当焦点位于弹出窗口时: 箭头键将焦点移动到同级候选项目或文本框 其他键进入文本框,如果对话框本身没有处理,除了删除键

鼠标点击: 关闭弹出窗口或弹出窗口之外的弹出窗口。 如果单击弹出窗口中的候选项目,则更新文本框的值

要获得正确的焦点/线程需要付出很多努力。如果您负担得起一些表单空间,则可以向表单添加一个固定宽度的列表框,例如 Visual Studio 帮助查看器的索引窗格。

【讨论】:

  • Jiang:你有什么其他的建议可以达到同样的效果吗?
【解决方案2】:

在浏览了许多博客文章和不同的文章后,我达成了一个共识,即几乎不可能以我想要的方式解决我的问题。所以我决定要么想出一个自定义的解决方案,要么像盛江所说的那样,我需要实现我自己的自动完成对象。

我想出了一个符合我要求的解决方案,方法是在我添加自动完成自定义源时根据自动完成字符串列表中的最大字符串增加文本框的宽度。正如我所说,由于表单的大小限制,我无法增加文本框的宽度,所以我决定将此文本框保留在面板中并增加其中文本框的大小。面板不会随文本框一起增长,从而解决了我的问题。

我知道这不是完美的解决方案,但它符合我的要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多