ComboBox.AutoCompleteMode 属性引起的莫名错误
Luo Weifeng 2011-3-17
今天老乡叫我去调一个bug,程序的逻辑很简单,就是一个模糊查询器。他的想法是,当用户在一个Combox里边输入时,程序自动的使用模糊查询检索可能的结果,以下拉列表的方式呈现出来。下面是程序的主要代码。它主要捕获combox中文本的change事件。可是这么一个简单的问题却让人调试了一天,这个程序在快速输入两个字母查询的时候会出现内存重写错误。我尝试着去掉Combox.Items.Clear()就不会出现内存重写错误,可是那样Combox会越来越多,我请了C#方面的一个牛人过去也没整明白。后来还是我老乡自己弄出来了。他将ComboBox.AutoCompleteMode的属性设置成none之后竟然好了。
这个问题至今我还没有想明白,有想明白的或懂的帮小弟解解惑,不胜感激。
后记:
貌似明白了,这与上边的代码没有什么联系。如下是实现类似百度搜索的东西。这样就知道为什么当AutoCompleteMode = Suggest而没有在代码里边指定AutoCompleteSource的时候就会出现内存错误了。MSDN有说http://msdn.microsoft.com/zh-cn/library/system.windows.forms.combobox.autocompletemode.aspx “AutoCompleteMode 和 AutoCompleteSource 属性必须一起使用。”所以才会出现上边的错误,呵呵,出错了学会在错误中总结。进步ing……
至于为什么在最初有combox.items.clear()就会报错的原因可能是这样的。首先输入一个j时,数据库里边查询到一个jlink和jsp所以她返回了数据,这里关键是事件的触法顺序,当输入第一个j时先触法的是text—changed事件,在text_changed事件中我们为combox添加了items,而后触法的是combox的自动补全事件,这时候combox的completesource是有内容的,所以不会出错,但是如果我们在text_changed事件的最后添加clear调用的话,那么在接下来的自动补全过程中,completesource是空的, 这与msdn上描述的需要同时使用completemode和completesource是违背的,剩下的事就是微软的事了,所以问题就这样产生了。调试起来也没有什么好的办法,因为这种奇妙的错误很难被察觉。所以说microsoft诚然做的很好,但是我们不能在任何领域都依赖他,特别是嵌入式领域,因为他的深度封装,致使在出现问题时不容易调试,比较晦涩。