C# SQL 如何为DataGridView第1列添加关联数据库的自动完成功能
DataGridView指定列添加自动完成提示实现方案
核心逻辑:DataGridView单元格进入编辑状态时,底层的编辑控件本质还是TextBox,只需在编辑触发时给目标列的编辑控件绑定提前准备好的自动完成集合即可实现需求。
实现步骤
- 首先在窗体类中声明全局自动完成集合,避免每次编辑重复查询数据库:
// 全局存储产品名称自动完成集合 private AutoCompleteStringCollection _pNameAutoCollection = new AutoCompleteStringCollection();
- 在窗体加载事件中查询数据库初始化自动完成集合,同时给DataGridView绑定编辑控件显示事件:
private void Form1_Load(object sender, EventArgs e) { // 替换为你的实际数据库连接字符串 string connStr = "你的数据库连接字符串"; using (SqlConnection connection = new SqlConnection(connStr)) { SqlCommand cmdauto= new SqlCommand("SELECT distinct pNAME FROM tbl_product", connection); connection.Open(); SqlDataReader readershifra = cmdauto.ExecuteReader(); while (readershifra.Read()) { _pNameAutoCollection.Add(readershifra.GetString(0)); } connection.Close(); } // 绑定编辑控件显示事件,也可直接在设计器中绑定 dataGridView1.EditingControlShowing += dataGridView1_EditingControlShowing; }
注:修正了你原代码的笔误,原代码中定义的DataReader变量名为
readershifra,循环读取时误用了reader,会导致编译报错。
- 实现
EditingControlShowing事件处理逻辑,仅给索引为1的列配置自动完成属性:
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { TextBox editTextBox = e.Control as TextBox; if (editTextBox == null) return; // 判断当前编辑的列是否为目标列(索引1) if (dataGridView1.CurrentCell.ColumnIndex == 1) { editTextBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend; editTextBox.AutoCompleteSource = AutoCompleteSource.CustomSource; editTextBox.AutoCompleteCustomSource = _pNameAutoCollection; } else { // 其他列清空自动完成配置,避免串扰 editTextBox.AutoCompleteMode = AutoCompleteMode.None; editTextBox.AutoCompleteCustomSource = null; } }
可选配置
- 自动完成行为可通过修改
AutoCompleteMode调整:Suggest仅弹出推荐列表,Append仅自动补全匹配后缀,SuggestAppend同时生效两种效果,按需选择即可。 - 如果产品名称数据需要动态更新,可单独封装集合刷新方法,需要时重新查询数据库赋值给
_pNameAutoCollection即可。
内容的提问来源于stack exchange,提问作者Leo Mujaj
相关产品推荐
相关产品推荐

