各位大大们有何良策,描述如下:功能描述:初始化将数据赋值給ComboBox,通过输入值再查询数据库,功能类似于google搜索功能
    例如:初始化ComboBox显示的是Content下的5条内容
         当输入字母as的时候,联合SeqNo与Content,
         as->张三,as->李四,同时搜索Content里面模糊匹配as的,即as11,as22,一共四条数据直接绑定的话,数据动态变化会报"内存破坏"的信息,所以这里就没有绑定了存在的问题:     1.当输入关键字时,输入的顺序是反序的                2.鼠标指针被窗体掩盖                3.输入关键字后,下拉框自动弹出时点内容需点击两次                4.下拉列表出来后,不能使用键盘上下键进行选择
解决了问题一和二,第三个和第四问题待解决
数据库表1:   ItemNo     SeqNo    Content
         5         as1       张三
         5         as2       李四
         5          33       as11
         5          55       as22
         5          丁       ad33
sql:
    初始化查询:
    SELECT ItemInfoNo,Content,SeqNo From SickItemInfo Where ItemNo=5 Order by ItemInfoNo
    ComboBox 输入模糊查询:queryCondition即为输入的模糊字段
    SELECT ItemInfoNo,Content,SeqNo From SickItemInfo Where ItemNo=5 " + " And (Content like '" + queryCondition + "%' Or SeqNo like '" + queryCondition + "%') Order by ItemInfoNo";测试代码:
        
        private void Form1_Load(object sender, EventArgs e)
        {
            this.comboBox1.TextChanged -= new System.EventHandler(this.comboBox1_TextChanged);
            
            DataSet dataSet = GetUriResultInfo();//即初始化查询
            for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
            {
                this.comboBox1.Items.Add(dataSet.Tables[0].Rows[i]["Content"]);
            }
            this.comboBox1.TextChanged += new System.EventHandler(this.comboBox1_TextChanged);
        }        private void comboBox1_TextChanged(object sender, EventArgs e)
        {
            try
            {
                this.comboBox1.TextChanged -= new System.EventHandler(this.comboBox1_TextChanged);
                comboBox1.Items.Clear();
                string text = this.comboBox1.Text;
                DataSet dataSet = GetUriResultInfo(text);                //if (this.comboBox1.Text != "" && this.comboBox1.Text != " ")
                //{
                //    comboBox1.DataSource = null;
                //}
                //comboBox1.DataSource = dataSet.Tables[0];
                //comboBox1.DisplayMember = "Content";
                //comboBox1.ValueMember = "SeqNo";
                //comboBox1.SelectedIndex = -1;
                
                for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
                {   
                    this.comboBox1.Items.Add(dataSet.Tables[0].Rows[i]["Content"]);
                }
                
                comboBox1.DroppedDown = true;
                comboBox1.Text = text;
                comboBox1.SelectionStart = comboBox1.Text.Length;
                //显示鼠标指针
                System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.IBeam;
                //保持鼠标指针形状
                Cursor = System.Windows.Forms.Cursors.Default;
                this.comboBox1.TextChanged += new System.EventHandler(this.comboBox1_TextChanged);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally { }
        }
        
     

解决方案 »

  1.   

    查过相关的帖子
    将属性AutoCompleteMode = suggest;
         AutoCompleteSource = ListItems;
    可能只适用于静态的绑定ComboBox,因为输入模糊字符是要重新查询数据库的
    尝试了每查询一次,都重新绑定ComboBox,结果老是报内存保护等错误,可能不能动态查询
      

  2.   

    http://download.csdn.net/source/985752http://www.codeproject.com/KB/combobox/DotNetMultiColumnComboBox.aspx
      

  3.   

            private DataTable GetData(string strSQl)
            {
                DataTable dtData = new DataTable();
                using (SqlConnection thisConnection = new SqlConnection(
                   @"Data Source=.;Initial Catalog=PatrolDataBase;Integrated Security=True"))
                {
                    using (SqlDataAdapter thisAdapter = new SqlDataAdapter(
                        strSQl, thisConnection))
                    {
                        thisAdapter.Fill(dtData);
                    }
                    thisConnection.Close();
                }
                return dtData;
            }        BindingSource bind = new BindingSource();
            string str1 = "select SeqNo from TestTable union all select Content from TestTable";
            private void Form1_Load(object sender, EventArgs e)
            {
                comboBox1.DisplayMember = "SeqNo";
                comboBox1.DataSource = GetData(str1);            comboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
                comboBox1.AutoCompleteSource = AutoCompleteSource.ListItems;
            }
      

  4.   

    不用总查数据库,
    你用datatable中的内容做查询就行了,combobox.items.clear()
    条件合适的再combobox.items.add()
      

  5.   


    CREATE TABLE [dbo].[TestTable] (
    [ItemNo] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [SeqNo] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [Content] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GOinsert into TestTable select
     '5', 'as1', '张三' union all select
     '5', 'as2', '李四' union all select
     '5', '33', 'as11' union all select
     '5', '55', 'as22' union all select
     '5', '丁', 'ad33'
    select SeqNo from TestTable union all select Content from TestTable
      

  6.   

    虽然不用总查询数据库,如果是combobox.items.add()来添加和删除,而不是绑定,那么应该是达不到
    类似于GOOGLE的下拉功能的
      

  7.   

    或者说,如果是手动注入comboBox,那么必然用到DroppedDown = ture;
    所以问题又回到了原点了
      

  8.   

    这个例子也是静态绑定的,不涉及到动态查询以及更新dataTable,而且如果ComboBox绑定了
    某个DataTable,此时无论是将该comboBox重新绑定则报错"内存保护",更新DataTable也
    无济于事....
      

  9.   

    http://www.codeproject.com/KB/combobox/addselecttoboundcombo.aspx
    这个例子可以在dataSource绑定的情况下,添加数据,然后还是出现了文中提到的那四个问题,
    感觉所想到的办法都在原地绕圈,真的是个BUG吗?
    期待高手来解答~
      

  10.   

    直接绑定的话,数据动态变化会报"内存破坏"的信息,所以这里就没有绑定了???
    WHY????
    重新 搜索数据回来后,把 下拉的 把 DT重新赋值给 下拉,再 DataBind() 一次!