我正在使用一个文本框在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名将会发生变化的问题。
答案 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