【问题标题】:Textbox Auto Complete - Winform + LINQ文本框自动完成 - Winform + LINQ
【发布时间】:2010-11-16 22:17:42
【问题描述】:

我正在用一个 dataGrid 和一个 TextBox 构建一个简单的 win 表单应用程序。 我有大约 1 万条姓名记录。

我想要做的是实现某种自动完成功能,因此当用户在文本框中键入内容时,数据网格会更新以相应地显示匹配项。

为了测试这一点,我有一个返回名称表的 DataContext 对象,我在 textBox1_TextChanged 事件中放置了一些代码来重置数据源

this.dataGrid1.DataSource = (from p in connectionWrapper.getConnectionObj.PatientsNormalizeds where p.Name.Contains(textBox1.Text) select p).Take(30);

这在本地连接上工作得很好,但是当从远程 SQL 服务器中提取数据时,这当然太慢了,输入变得迟缓并且用户无法接受。

只是想知道在不改变设计的情况下是否可以做任何事情。我当然可以在 form_loading 将整个表加载到列表或 DataTable 中并对其运行搜索,但这会导致表单停止响应 3 秒左右...

这对于大多数开发人员来说可能非常简单,但我是新手。

谢谢!

【问题讨论】:

  • 实际上,您首先选择数据库中包含用户输入的所有名称,然后才获取前 30 个结果。但是您的数据库已完全处理!您应该在找到第 30 个结果后立即停止查询。我不太了解 LINQ 或 SQL,无法回答,但如果您这样做,解决方案应该很容易。
  • p 是字符串还是填充对象?有时,如果您返回多个对象,则会显着减慢加载时间,因为它必须填充每个对象。
  • 这是一个对象,但没有什么花哨的,只是名字、出生日期、电话号码等。

标签: c# winforms linq algorithm


【解决方案1】:

我想到了几种方法。第一个将涉及不过滤每个按键,而是在用户暂停时进行搜索,即他们认为他们已经输入了足够的内容并希望查看返回的内容。这可以使用计时器来完成,每次按键都会重置延迟。

使用后台线程运行查询使界面在检索数据时保持响应。

我还会考虑从 LINQ 返回最小对象,即只是 p.Name 而不是整个 p 对象。这也将有助于加快数据传输和响应速度。

【讨论】:

  • 这可以通过使用响应式扩展轻松实现。
  • @Giorgi,这看起来像是一个答案。你应该这样发布。
  • 我刚刚在下面发布了我的答案。
【解决方案2】:

您可以使用 Reactive Extensions 轻松实现一个解决方案,如果用户输入了一定数量的符号,则查询远程服务器,暂停一段时间,非常容易。以下动手实验室正是这样做的:Rx .NET HOL

【讨论】:

  • 我采取了简单的方法,将我的设计更改为在暂停时获取并使用后台工作程序,现在延迟对用户来说并不明显。
  • 使用 Rx 会带来更好的性能吗?还是这更像是一种面向设计的改进。
  • @Rillanon - 我认为它不会提供更好的性能,因为从 sql server 获取数据并不重要。
【解决方案3】:

您应该在后台线程上运行选择,也就是 BackgroundWorker

【讨论】:

    【解决方案4】:

    您可以将数据缓存在本地 XML 文件或其他东西中。应用程序可能第一次没有响应(除非您使用线程在后台预加载数据),但每隔一次运行应用程序时它会非常快。
    您可以实现预加载/启动屏幕以通知用户数据已在后台加载。

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      • 2012-10-05
      • 2011-04-18
      • 2010-09-22
      相关资源
      最近更新 更多