【问题标题】:C# Textbox AutoComplete: Limit to ~50 suggestionsC# 文本框自动完成:限制为 ~50 条建议
【发布时间】:2011-01-11 21:07:52
【问题描述】:

我在 C# 中使用一个文本框作为数据库 (Access SQL) 记录的输入,按 ID 号查找。我希望能够在文本框上使用 AutoComplete,但有一些限制。

最大的问题是系统中的 id 数量大约为数千,因此我需要监视文本框中的内容,而不是一次性填充自动完成框有大约 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 名会发生变化的问题。

【问题讨论】:

  • 这是 WinForms 吗? WPF? ASP.NET?

标签: c# winforms autocomplete


【解决方案1】:

你不能从表 WHERE 中选择前 50 名吗?

【讨论】:

    【解决方案2】:

    将您的建议限制在 50 条对您有用吗? 当您选择建议时,您可以使用如下查询:

    从 YourTable WHERE 中选择 TOP 50 * ...

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 谢谢,这确实有效。我的部分问题也是在每次按键时在 AutoCompleteCustomSet 上调用 Clear()。显然这并不是真正必要的,而且这样做会产生负面影响。
      【解决方案4】:

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

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

      Use IAutoCompleteDropDown::ResetEnumerator to reset the candidate list.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-17
        • 2012-05-21
        • 2017-10-22
        • 2012-11-15
        • 2016-04-27
        • 1970-01-01
        • 2017-10-19
        • 1970-01-01
        相关资源
        最近更新 更多