[英]Textbox Auto Complete - Winform + LINQ
我正在使用一个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秒左右......
这对大多数开发人员来说可能非常简单,但我很新。
谢谢!
我想到了几种方法。 第一个不涉及过滤每个按键,而是搜索用户暂停时,即他们认为他们输入的内容足够,并希望看到返回的内容。 这可以通过使用计时器来完成,在该计时器中,每次按键都会重置延迟。
使用后台线程运行查询可使接口在检索数据时响应。
我还要看看从LINQ返回最小对象,即只是p.Name而不是整个p对象。 这也将有助于加快数据传输和响应速度。
您可以使用Reactive Extensions轻松实现一个解决方案,该解决方案非常容易地在用户键入了一定数量的符号(暂停了一段时间)后查询远程服务器。 以下实验室就是这样做的: Rx .NET HOL
您应该在后台线程aka BackgroundWorker
上运行select
您可以在XML文件或其他东西中本地缓存数据。 应用程序可能第一次没有响应(除非您正在使用线程在后台预加载数据),但是对于其他每一次运行应用程序的应用程序,它的响应速度确实会很快。
您可以实现预加载/启动屏幕以通知用户数据在后台加载。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.