获取winforms中文本框的自动完成下拉框的句柄

时间:2010-10-28 05:51:11

标签: c# winforms autocomplete textbox

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

因此我想知道是否有办法获取该自动填充框的句柄,然后在不改变文本框宽度的情况下增加该下拉列表的宽度?

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

鼠标点击: 在弹出窗口或弹出窗口之外关闭弹出窗口。 如果单击弹出窗口中的候选项

,则更新文本框的值

需要花费很多精力才能使焦点/线程正确。如果你能负担得起一些表单空间,你可以在表单中添加一个固定宽度的列表框,就像Visual Studio帮助查看器的索引窗格一样。

答案 1 :(得分:3)

经过大量的博客文章和不同的文章后,我达成共识,几乎不可能以我想要的方式解决我的问题。所以我决定要么提出一个自定义解决方案,要么就像盛江说我需要实现自己的自动完成对象。

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

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