当前位置: 代码迷 >> C# >> WinForm 的智能提示,该如何实现呢
  详细解决方案

WinForm 的智能提示,该如何实现呢

热度:472   发布时间:2016-05-05 05:11:34.0
WinForm 的智能提示,该怎么实现呢?
我想实现的效果是这样的,我动态创建多个TextBox,用户在TextBox 输入文字,TextBox下智能提示与输入有关的列表(通过数据库动态查询出),点击项放入Textbox,类似Web的AutoComplete(或者百度的搜索智能提示).


现在我在每个TextBox里注册TextChanged 事件处理,动态绑定提示数据,可是有时是提示:"尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"错误。
事件处理部分代码

System.Windows.Forms.AutoCompleteStringCollection acsc = new System.Windows.Forms.AutoCompleteStringCollection();
                System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)sender;
                tb.AutoCompleteCustomSource = acsc;
                tb.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.CustomSource;
                tb.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest;


CS没怎么搞过,搞了好久了,还是没思路。有没有高手实现过类似的效果啊?这种提示效果该怎么实现呢?谢谢!
------解决思路----------------------
这个我在CodeProject看过一个大牛做的类似的东西,还是有些难度,你上CodeProject 搜索 Intellisense popup, 找那篇文章看看。
------解决思路----------------------
通过数据库动态查这东西很不靠谱,效率太低了,每输入一个字符就要卡半天
你还是把数据库里的东西先读到内存里,然后再匹配吧
------解决思路----------------------
没看懂你这个动态的是怎么个动态法,输入过一次的内容自动保存下来以便下次再次输入?把它更新回数据源里同时insert到数据库或文件
------解决思路----------------------
ComboBox有个AutoCompleteCustomSource,AutoCompleteMode,AutoCompleteSource
设置好数据源。

设置一下DropDownStyle=DropDown

即能自动补充,又能保留下拉列表的功能
------解决思路----------------------
引用:
3楼的思路其实不错,其实所有匹配的数据也不多,不到1000条,是可行的。
但是如果不是数据库查询,就是搞成这个智能提示的列表是动态的(服务器获取(缓存)或者本地文件),不是固定的源,该怎么搞呢。
没有类似Web 的ajax 机制去获取么?WinForm 有类似Jquery 的AutoComplete 的组件可以用么?谢谢!


此为正解。

百度等搜索引擎,是有数据中心专门提供服务的。每次改变输入,都会进行输入匹配。其实就是一个一对多的哈希表,key就是输入框的所有内容,value为返回值。有时候输入太长太偏,就没有自动提示了~~所以响应快。

单机或者单个服务器的话,是无法承受这巨大的一对多哈希表的,从数据库通过like查询,效率低,全文索引也难搞,所以1w条记录以上就会很卡。。

---
至于所谓的输入1就去表1查,输入2就去表2查。。。这肯定要对用户透明,而且要考虑所有合法/非法输入。。
------解决思路----------------------
  我要输入个1,你就去表1里取数据,我输入个2,你去表2里取数据
假定 表1中 有11、12、21、22
         表2中有13、14、23、24

那你在绑定TextBox的AutoCompleteCustomSource的时候,绑定表1、表2的数据集和,把不符合要求的如表1中的21、22,表2中13、14数据都筛除,绑定所有符合要求的数据,只绑定一次

TextBox的TextChanged事件不要了。
------解决思路----------------------
引用:
现在是按照你说的实现的,form 加载的时候一次绑定好AutoCompleteCustomSource。后面不变。
我是想问,TextBox 的AutoCompleteCustomSource 可以改变么?

我想是可以修改的,http://bbs.csdn.net/topics/390324804里面的例子,先Clear一下,再绑定。只是不能在TextChanged事件里面改,也就是修改的时候TextBox里面的内容不能改变,否则就冲突了。
------解决思路----------------------
你这样又回到最初的问题了
你如何判断什么时候绑定这个,什么时候又绑定那个?
还是直接绑定所有列表的并集最简单了
------解决思路----------------------
这些功能都是跟不上时代的。

winform这么些年真正升级过吗?你应该使用wpf。



引用:
Quote: 引用:

Quote: 引用:

现在是按照你说的实现的,form 加载的时候一次绑定好AutoCompleteCustomSource。后面不变。
我是想问,TextBox 的AutoCompleteCustomSource 可以改变么?

我想是可以修改的,http://bbs.csdn.net/topics/390324804里面的例子,先Clear一下,再绑定。只是不能在TextChanged事件里面改,也就是修改的时候TextBox里面的内容不能改变,否则就冲突了。

是冲突,因为在TextChanged 的时候系统默认是要智能提示的,所以这个时候 AutoCompleteCustomSource  是要锁定的。
如果修改 就会冲突出错。
那在 焦点移除事件的时候修改这个应该没有问题。但是这样不会的到想要的效果。
有没有一种机制让某个事件在另外的事件执行完之后执行? 比如,可以先执行TextChanged 在这里面控制 智能提示先不要 动作,我修改完 AutoCompleteCustomSource 再让他执行智能提示呢?


除非扔掉它,另找第三方控件。
  相关解决方案