文本框自动完成 - Winform + LINQ

时间:2010-11-16 13:37:46

标签: c# winforms linq algorithm

我正在构建一个简单的win表单应用程序,其中包含一个DataGrid,一个TextBox。 我有大约10K的名字记录。

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

为了测试这个,我有一个返回名称表的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秒左右......

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

谢谢!

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您应该在后台线程BackgroundWorker

上运行选择

答案 3 :(得分:0)

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