C#文本框自动完成:限制为~50条建议

时间:2010-02-01 19:44:32

标签: c# winforms autocomplete

我正在使用一个文本框在C#中工作,该文本框用作id号的数据库(Access SQL)记录查找的输入。我希望能够在文本框中使用自动完成功能,但有一些限制。

最大的问题是系统中的ID数量大约为数千,因此我不需要一次性填充AutoComplete框,而是需要监控文本框中的内容并仅显示自动填充建议。有大约50个或更少的选择。

目前,我正在对每个KeyDown执行此查询:SELECT count(*)FROM Table WHERE id LIKE'textbox.text%'

当计数小于50时,我使用上述语句的SELECT id版本的结果填充自动完成。这让我遇到了几个问题,大多数似乎是我不明白的C#怪癖。

1)当我在单个KeyDown事件中清除或添加AutoCompleteCustomSet时,按下的实际键不会被添加到字符串中(即不会发生正常的文本框输入行为)。

2)我尝试将AutoCompleteCustomeSet更新分离到另一个事件(KeyPress或KeyUp),但这会导致崩溃,或者自动完成显示只会在隐藏之前显示。

我觉得这个问题必须是常见的,我只是以错误的方式去做。有人可以提供一些建议吗?谢谢!

编辑:这是Windows窗体

EDIT2:排名前50的选项无法解决用户输入(可能退格和重新输入)前50名将会发生变化的问题。

4 个答案:

答案 0 :(得分:1)

您是否尝试过TextChanged事件? 我希望在文本框更新后触发该事件,从而避免你提到的怪癖。

答案 1 :(得分:0)

难道你不能从表格WHERE中选择前50位......?

答案 2 :(得分:0)

只是将你的建议限制在为你工作吗? 选择建议后,您可以使用以下查询:

选择TOP 50 *来自YourTable WHERE .....

答案 3 :(得分:0)

你遇到崩溃的原因可能是你get a race condition更换自动完成源时,后台线程使用它来计算候选人(或者你在候选人中放入null而不是String.Empty)列表)

在Windows Vista之前,自动完成对象match candidates with prefix only,因此不要填充不以键入的字符串开头的候选字符串。

Use IAutoCompleteDropDown::ResetEnumerator to reset the candidate list