2010-11-16 62 views
0

我正在构建一个简单的胜利形式的应用程序与一个数据网格,一个文本框。 我有大约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秒左右...

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

谢谢!

+0

其实,你首先选择包含在DB用户输入的所有名称,只有在这之后,你采取的第一个30个结果。但你的数据库已经完全处理!您应该在找到30个第一个结果后立即停止您的查询。我不太了解LINQ或SQL,但如果你这样做,解决方案应该很简单。 – 2010-11-16 13:44:01

+0

是一个字符串还是填充一个对象?有时候,如果你返回一些对象,它会显着减慢你的加载时间,因为它必须填充每个对象。 – Gage 2010-11-16 13:46:08

+0

这是一个对象,但没有什么幻想,只是名称,dob,电话#等等等。 – Rillanon 2010-11-16 13:53:02

回答

1

有几种方法值得思考。第一种方法不涉及每次按键过滤,而是搜索用户何时暂停,即他们认为自己的输入已足够,并且希望看到返回的结果。这可以通过使用定时器完成,其中每次按键都会重置延迟。

使用后台线程来运行查询离开界面的响应而检索数据。

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

+0

这可以很容易地通过使用反应性扩展实现。 – Giorgi 2010-11-16 13:49:21

+0

@Giorgi,看起来像一个答案。你应该这样发布。 – Lazarus 2010-11-16 13:52:35

+0

谢谢!这给了我一些很好的想法。 – Rillanon 2010-11-16 13:53:28

0

你应该又名BackgroundWorker

0

可以在XML文件或一些数据缓存在本地运行一个后台线程的选择。应用程序可能第一次没有响应(除非您使用线程在后台预加载数据),但是对于运行应用程序的每一次,它都会非常快。
您可以实施预加载/闪屏以通知用户数据在后台加载。

1

可以使用无功扩展轻松实现它询问,如果用户键入一定量的符号远程服务器的解决方案,暂停了一段时间,很容易。在实验室下面的手正是这样做的:Rx .NET HOL

+0

+1作为一个伟大的建议! – Lazarus 2010-11-16 15:21:35

+0

我通过将设计更改为暂停和使用背景工作时获取简单方法,现在延迟对用户而言并不明显。 – Rillanon 2010-11-17 12:26:24

+0

使用Rx会有更好的表现吗?或者这更多的是一种以设计为导向的改进。 – Rillanon 2010-11-17 12:26:53