文本框自动完成 - Winform + LINQ
我正在构建一个简单的胜利形式的应用程序与一个数据网格,一个文本框。 我有大约10K的名字记录。文本框自动完成 - Winform + LINQ
我想要做的就是实现某种形式的自动完成功能,这样当用户键入到文本框,数据网格被更新,以显示相应的比赛。
只是为了测试这一点,我有一个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对象。这也将有助于加快数据传输和响应速度。
你应该又名BackgroundWorker
可以在XML文件或一些数据缓存在本地运行一个后台线程的选择。应用程序可能第一次没有响应(除非您使用线程在后台预加载数据),但是对于运行应用程序的每一次,它都会非常快。
您可以实施预加载/闪屏以通知用户数据在后台加载。
其实,你首先选择包含在DB用户输入的所有名称,只有在这之后,你采取的第一个30个结果。但你的数据库已经完全处理!您应该在找到30个第一个结果后立即停止您的查询。我不太了解LINQ或SQL,但如果你这样做,解决方案应该很简单。 – 2010-11-16 13:44:01
是一个字符串还是填充一个对象?有时候,如果你返回一些对象,它会显着减慢你的加载时间,因为它必须填充每个对象。 – Gage 2010-11-16 13:46:08
这是一个对象,但没有什么幻想,只是名称,dob,电话#等等等。 – Rillanon 2010-11-16 13:53:02