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

4
我想调整文本框自动完成下拉框的宽度。我不想调整文本框的宽度,只想调整自动完成下拉框的宽度。我知道不能使用文本框提供的属性来增加自动完成下拉框的宽度。
因此,我想知道是否有办法获取自动完成框的句柄,然后增加下拉列表的宽度,而不改变文本框的宽度?
如果这不可能,那么我想创建自定义带自动完成功能的文本框,如何使用微软提供的现有自动完成功能?是否有任何库可用于此?

可以根据需要修改为TextBox的下拉宽度。 - Loathing
2个回答

5
我认为你不能使用微软的自动完成实现,因为它没有调整下拉列表宽度的选项。
创建一个后台线程以不妨碍输入,并连接组合框或文本框的文本更改事件以更新候选列表(假设您提到了下拉列表,因此采用自动建议模式)。如果您有组合框,可以动态添加/删除组合框项目。但对于下拉列表和文本框项目,您需要弹出窗口
很容易显示弹出窗口,但您不能使用固定位置,否则当文本框靠近屏幕边缘时,它将超出屏幕。并且焦点逻辑有点复杂。您需要保持焦点在文本框上,除非用户按箭头键进行选择。
当焦点在文本框上时: 箭头键将焦点移动到弹出窗口 其他按键会进入文本框,除非鼠标在弹出窗口上时按下删除键。 当焦点在弹出窗口上时: 箭头键将焦点移动到兄弟候选项或文本框 其他按键会进入文本框,除非弹出窗口本身处理,鼠标在弹出窗口上时按下删除键。
鼠标点击: 在弹出窗口外或弹出窗口内部关闭弹出窗口。 如果单击弹出窗口中的候选项,则更新文本框的值。
正确设置焦点/线程需要付出很多努力。如果您可以承担一些空间,则可以将固定宽度的列表框添加到表单中,例如Visual Studio帮助查看器的索引窗格。

江:您有什么其他建议可以实现同样的效果吗? - JPReddy

3

在阅读了很多博客文章和不同的文章之后,我得出结论:按照我想要的方式解决我的问题几乎是不可能的。所以我决定要么想出一种自定义解决方案,要么像Sheng Jiang所说,我需要实现自己的自动完成对象。

我已经想出了一个解决方案,通过根据自动完成字符串列表中最大字符串的大小来增加文本框的宽度,同时添加自定义源。正如我所说,由于表单上有大小限制,我无法增加文本框的宽度,所以我决定将这个文本框放在一个面板中,并增加文本框的大小。面板不会随着文本框的增长而增长,因此解决了我的问题。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接