新手@@小弟想实现winform的功能:datagridview的某列是DataGridViewTextBoxColumn数据列有“aaaqqq”、“aaa”,如果编辑DataGridViewTextBoxColumn列的时候输入“q”,那么回车自动弹出“aaaqqq”。如果输入“aa”就回车会弹出“aaaqqq”、“aaa” 这些信息来选择。如果输入其他以外的数据会提示 “没有该信息”。 问题关键是怎么不输入开头的字母也能查询对应的信息,还有怎么判断没有该数据。谁能指导一下,可以加QQ 1434345614远程帮我解决下。小弟感激不尽!!!!!!!

解决方案 »

  1.   

    思路:
    点击编辑后获取TextBoxColumn
    然后在输入的时候在写你的逻辑
      

  2.   

    还要弹出选中框的话, 用DataGridViewComboBoxColumn。思路还是很简单的:在单元上接收KeyDown事件,如果是回车键。取出当前单元的输入,在数据源中模糊查找,结果添加到combobox的items集合中,唯一则赋值,不唯一则弹出下拉框,没有结果则弹出提示窗。
      

  3.   

    if (e.Control is DataGridViewTextBoxEditingControl)
                {
                    DataGridViewTextBoxEditingControl te = (DataGridViewTextBoxEditingControl)e.Control;
                    te.Name = "字段名";
                    te.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
                    te.AutoCompleteSource = AutoCompleteSource.CustomSource;
                    SqlConnection conn1 = new SqlConnection(str);
                    conn1.Open();
                    string comand2 = @"select * from studentInfo";
                    SqlDataAdapter adatter2 = new SqlDataAdapter(comand2, conn1);
                    DataSet dataset2 = new DataSet();
                    adatter2.Fill(dataset2, "表名");
                    string[] itemsg = new string[dataset2.Tables["studentInfo"].Rows.Count];
                    int col = dataGridView1.CurrentCell.ColumnIndex;
                    switch (col)
                    {
                        case 0:
                            //for (int i = 0; i < dataset2.Tables["studentInfo"].Rows.Count; i++)
                            //{
                            //    itemsg[i] = dataset2.Tables["studentInfo"].Rows[i][0].ToString();
                            //    te.AutoCompleteCustomSource.AddRange(new string[] { itemsg[i] });
                            //}
                            break;
                        case 1:
                            for (int i = 0; i < dataset2.Tables["表名"].Rows.Count; i++)
                            {
                                itemsg[i] = dataset2.Tables["studentInfo"].Rows[i]["字段名"].ToString();
                                te.AutoCompleteCustomSource.AddRange(new string[] { itemsg[i] });
                            }
                            break;
                        case 3:
                            break;
                        case 4:
                            break;
                        case 5:
                            break;
                        default:
                            break;
                    }
                }
    代码要改哪里才有效果啊!!!!!!!!!!!!!!
      

  4.   

    写代码有点啰嗦, 我说个简单的思路吧。 
               
    新建一个BindingSource对象, private BindingSource bind = new BindingSource();
    将该bind.DataSource设置为装载了“aaaqqq”、“aaa”的DataTable,  bind.DataSource = YourDataTable;
    然后将 DataGridViewTextBoxColumn 的数据源设置为bind;最后在 DataGridViewTextBoxColumn 的 ValueChange 事件中, 设置bind的Filter字符串就行了。 
    如下:bind.Filter = string.Format("DataTable列名 Like 'DataGridViewTextBoxColumn中内容值%' ");
    这样就可以了。 依照这个思路,自己去实现吧。
      

  5.   

    不是很好理解。因为BindingSource还没用过。我是手写绑定去datagridview的
      

  6.   

    楼主是要sql的查询语句,怎么模糊查找含有a,q的条目吗?sql语句一般是这样
    select * from table1 where name like '%q%'
    select * from table1 where name like '%a%'
    还是说要在字符串里面查找
    String.IndexOf  (Char, Int32, Int32)方法
    String.IndexOf  (‘q', 0, 10);
      

  7.   

    直接修改语句select * from table1 where name like '%q%'
     没效果
      

  8.   

    弹出的选择信息是下拉框吧,这个应该重写datagridview实现。如果暂时没有人发上来现成的代码,你自己先去网上搜搜,有相关的代码。
      

  9.   

    问下楼主。你原来的“aaaqqq”、“aaa”,是从数据库里面读出来的数吗?你的意思是想实现输入q就找类似aaaqqq这样的项,这些项的开头不是q,但是里面含有q,是这样的意思吗?
      

  10.   

    遍历datagridview中单元格,然后判断各单元格是否包含输入的条件
    for (int i = 0; i < dataGridView1.Rows.Count; i++)
    {
    if(dataGridView1.Rows[i].Cells[1].Value.ToString().Contains("aaa"))
    {
    }
    }
      

  11.   


    我照着你的思路实现了一下,不行的,你再帮忙指点一下?    public partial class ColumnAutoComplete2 : Form
        {
            DataSet sqlDs;
            BindingSource bs;        DataGridViewTextBoxEditingControl te;
            int rowIndex = -1;
            int colIndex = -1;        public ColumnAutoComplete2()
            {
                InitializeComponent();
            }        private void ColumnAutoComplete2_Load(object sender, EventArgs e)
            {
                sqlDs =new DataSet();            DataTable dt = new DataTable("产品表");
                DataColumn columnProductID = new DataColumn("ProductID", System.Type.GetType("System.String"));
                dt.Columns.Add(columnProductID);            DataRow dr1 = dt.NewRow();
                dr1["ProductID"] = "aaaqqq";
                dt.Rows.Add(dr1);            DataRow dr2=dt.NewRow();
                dr2["ProductID"] = "aaa";
                dt.Rows.Add(dr2);            sqlDs.Tables.Add(dt);
                
                dataGridView1.DataSource=sqlDs.Tables["产品表"];            bs = new BindingSource(sqlDs, "产品表");        }        private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                if (e.Control is DataGridViewTextBoxEditingControl)
                {
                     te=(DataGridViewTextBoxEditingControl)e.Control;                te.Name = "ProductID";
                    
                    if (te.DataBindings.Count == 0)
                        te.DataBindings.Add("Text", bs, "ProductID");                te.KeyDown += new KeyEventHandler(te_KeyDown);
                }
            }        private void te_KeyDown(object sender, KeyEventArgs e)
            {
                bs.Filter = string.Format("ProductID like '" + dataGridView1.Rows[rowIndex].Cells[colIndex].Value + "%'");
                te.Refresh();
            }        private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
            {
                rowIndex = e.RowIndex;
                colIndex = e.ColumnIndex;
            }
        }
    }