ComboBox.AutoCompleteMode 属性引起的莫名错误



ComboBox.AutoCompleteMode 属性引起的莫名错误

 Luo Weifeng 2011-3-17

今天老乡叫我去调一个bug,程序的逻辑很简单,就是一个模糊查询器。他的想法是,当用户在一个Combox里边输入时,程序自动的使用模糊查询检索可能的结果,以下拉列表的方式呈现出来。下面是程序的主要代码。它主要捕获combox中文本的change事件。可是这么一个简单的问题却让人调试了一天,这个程序在快速输入两个字母查询的时候会出现内存重写错误。我尝试着去掉Combox.Items.Clear()就不会出现内存重写错误,可是那样Combox会越来越多,我请了C#方面的一个牛人过去也没整明白。后来还是我老乡自己弄出来了。他将ComboBox.AutoCompleteMode的属性设置成none之后竟然好了。

 

 

private void comboBox1_TextChanged(object sender, EventArgs e) { if (comboBox1.Text.Trim() == "") { return; } //Data Connection String Constr = @"Data Source=./SQLEXPRESS;AttachDbFilename=|DataDirectory|/CollecIC.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"; SqlConnection Conn = new SqlConnection(Constr); String SQL = "SELECT * FROM stand WHERE ICName like '%" + comboBox1.Text.Trim() + "%' and ICValue like '%" + textBoxValue.Text.ToString() + "%' and ICSize like '%" + textBoxSize.Text.ToString() + "%'"; Conn.Open(); //Sql Command SqlCommand cmd = Conn.CreateCommand(); cmd.CommandText = SQL; SqlDataReader myreader = cmd.ExecuteReader(); //Fill & view comboBox1.Items.Clear(); while (myreader.Read()) { if (myreader.HasRows) { textBoxValue.Text = myreader["ICValue"].ToString(); textBoxSize.Text = myreader["ICSize"].ToString(); textBoxFt.Text = myreader["ICFt"].ToString(); textBoxRemark.Text = myreader["ICRemark"].ToString(); comboBox1.Items.Add(myreader["ICName"].ToString()); pictureBox1.Image = Image.FromFile(myreader["ICPho"].ToString()); } } comboBox1.DroppedDown = true; myreader.Close(); Conn.Close(); }

这个问题至今我还没有想明白,有想明白的或懂的帮小弟解解惑,不胜感激。

后记:

 

貌似明白了,这与上边的代码没有什么联系。如下是实现类似百度搜索的东西。这样就知道为什么当AutoCompleteMode = Suggest而没有在代码里边指定AutoCompleteSource的时候就会出现内存错误了。MSDN有说http://msdn.microsoft.com/zh-cn/library/system.windows.forms.combobox.autocompletemode.aspx “AutoCompleteMode 和 AutoCompleteSource 属性必须一起使用。”所以才会出现上边的错误,呵呵,出错了学会在错误中总结。进步ing……

AutoCompleteStringCollection strings = new AutoCompleteStringCollection(); for (int i = 0; i < list.Count ; i++) { strings.Add("查询字符"); } textbox.AutoCompleteCustomSource = strings; textbox.AutoCompleteSource = AutoCompleteSource.CustomSource; textbox.AutoCompleteMode = AutoCompleteMode.Suggest;  

至于为什么在最初有combox.items.clear()就会报错的原因可能是这样的。首先输入一个j时,数据库里边查询到一个jlink和jsp所以她返回了数据,这里关键是事件的触法顺序,当输入第一个j时先触法的是text—changed事件,在text_changed事件中我们为combox添加了items,而后触法的是combox的自动补全事件,这时候combox的completesource是有内容的,所以不会出错,但是如果我们在text_changed事件的最后添加clear调用的话,那么在接下来的自动补全过程中,completesource是空的, 这与msdn上描述的需要同时使用completemode和completesource是违背的,剩下的事就是微软的事了,所以问题就这样产生了。调试起来也没有什么好的办法,因为这种奇妙的错误很难被察觉。所以说microsoft诚然做的很好,但是我们不能在任何领域都依赖他,特别是嵌入式领域,因为他的深度封装,致使在出现问题时不容易调试,比较晦涩。

你可能感兴趣的:(sql,String,Microsoft,command,Security,嵌入式)