页面显示数据使用的控件是ComponentFactory.Krypton.Toolkit中的KryptonDataGridView控件。在指定“商品”单元格中需要根据用户输入内容自动匹配数据库中商品信息,并且单元格处于编辑模式时显示一个查询图标的按钮,点击该按钮也将显示数据库中所有商品信息。 KryptonDataGridView显示控件此处命名为kDGVIndentDetail; 用于下拉显示匹配内容的DataGridView命名为dgv; 1、建立一个DataGridView类型的页面变量用于KryptonDataGridView单元格下拉显示匹配结果 1 //新建变量用于下拉显示的数据控件 2 3 DataGridView dgv = new DataGridView(); 4 5 //保存当前编辑单元格的坐标 6 7 private int _colindex;//列索引 8 9 private int _rowindex;//行索引 10 2、页面Load事件中设置dgv初始属性和添加一个单元格单击事件,提取为方法: 代码 1 //设置下拉显示控件的属性 2 3 private void _SetDGVDrop() 4 5 { 6 7 //初始为不可见并且只读 8 9 dgv.Visible = false; 10 11 dgv.ReadOnly = true; 12 13 dgv.Height = 100; 14 15 //单元格选择模式为正行选择 16 17 dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect; 18 19 dgv.MultiSelect = false; //只用单行选择 20 21 dgv.ColumnHeadersVisible = false; //隐藏列头 22 23 //设置列宽 24 25 dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; 26 27 dgv.BackgroundColor = Color.FromName("window"); 28 29 dgv.RowHeadersVisible = false; //隐藏行头 30 31 dgv.ScrollBars = ScrollBars.Vertical;//滚动条模式 32 33 dgv.AllowUserToAddRows = false; //禁止添加新行 34 35 dgv.AllowUserToDeleteRows = false; 36 37 dgv.AllowUserToOrderColumns = false; 38 39 dgv.AllowUserToResizeColumns = false; 40 41 dgv.AllowUserToResizeRows = false; 42 43 dgv.BackgroundColor = Color.White; 44 45 //设置单元格边框样式 46 47 dgv.AdvancedCellBorderStyle.Left = DataGridViewAdvancedCellBorderStyle.None; 48 49 dgv.AdvancedCellBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.Single; 50 51 dgv.AdvancedCellBorderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.None; 52 53 dgv.AdvancedCellBorderStyle.Top = DataGridViewAdvancedCellBorderStyle.None; 54 55 //添加单元格鼠标单击事件 56 57 dgv.CellMouseClick += new DataGridViewCellMouseEventHandler(dgv_CellMouseClick); 58 59 //向明细单显示控件中加入该下拉控件 60 61 kDGVIndentDetail.Controls.Add(dgv); 62 63 } 64 65 dgv的单元格单击事件: 3、数据显示控件kDGVIndentDetail的商品列(colProId)类型为:KryptonDataGridViewTextBoxCell,在列的ButtonSpecs属性中添加一个buttonSpecAny名称为buttonSpecAny4,设置buttonSpecAny4的图片: 4、buttonSpecAny4的单击事件中显示下拉显示控件并调用控件的绑定事件: 当单元格为编辑状态时,buttonSpecAny4按钮将显示,点击该按钮下拉控件显示所有数据,点击控件的某一列,将把指定的值赋给当前编辑的单元格(这里只取选中行[“aa”]列的值) 5、dgv的绑定方法:(为避免连接数据库,这里使用手工填充数据的方法) 代码 1 //绑定下拉显示控件 2 3 private void BindDGV(string str) 4 5 { 6 7 //填充数据源 8 9 DataTable dt = new DataTable(); 10 11 dt.Columns.Add("aa"); 12 13 dt.Columns.Add("bb"); 14 15 dt.Columns.Add("cc"); 16 17 dt.Columns.Add("ee"); 18 19 DataRow dr = null; 20 21 for (int i = 0; i < 5; i++) 22 23 { 24 25 dr = dt.NewRow(); 26 27 dr["aa"] = str + "aa" + i; 28 29 dr["bb"] = str + "bb" + i; 30 31 dr["cc"] = str + "cc" + i; 32 33 dr["ee"] = str + "ee" + i; 34 35 dt.Rows.Add(dr); 36 37 } 38 39 //绑定数据源 40 41 dgv.DataSource = dt; 42 43 } 44 45 6、现在实现在单元格直接输入内容时自动配备显示数据库中的内容,在kDGVIndentDetail显示控件的EditingControlShowing事件中处理: TextChanged事件中根据用户数据内容动态匹配 代码 1 void kcell_TextChanged(object sender, EventArgs e) 2 3 { 4 5 KryptonDataGridViewTextBoxEditingControl kdgvtbox = (KryptonDataGridViewTextBoxEditingControl)sender; 6 7 //MessageBox.Show(kdgvtbox.Text); 8 9 if (kDGVIndentDetail.Columns[kDGVIndentDetail.CurrentCell.ColumnIndex].Name == "colProId") 10 11 { 12 13 BindDGV(kdgvtbox.Text); 14 15 _colindex = kDGVIndentDetail.CurrentCell.ColumnIndex; 16 17 _rowindex = kDGVIndentDetail.CurrentCell.RowIndex; 18 19 Rectangle rect = kDGVIndentDetail.GetCellDisplayRectangle(_colindex, _rowindex, false); 20 21 //设置显示控件的位置 22 23 dgv.Left = rect.Left; 24 25 dgv.Top = rect.Top + kdgvtbox.Size.Height; 26 27 dgv.Visible = true; 28 29 } 30 31 32 33 } 34 35 7、滚动kDGVIndentDetail和改变列宽时,隐藏下拉显示控件 代码 1 private void kDGVIndentDetail_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e) 2 3 { 4 5 //隐藏下拉显示控件 6 7 dgv.Visible = false; 8 9 } 10 11 12 13 private void kDGVIndentDetail_Scroll(object sender, ScrollEventArgs e) 14 15 { 16 17 //隐藏下拉显示控件 18 19 dgv.Visible = false; 20 21 } 22 23 暂且写到这里,还需要在使用中调试修改,下面是效果图: 单击单元格进入编辑模式时,查询按钮显示(放大镜) 输入内容时显示匹配内容: 点击放大镜显示所有内容: 代码 1 //单元格启用编辑时 2 3 private void kDGVIndentDetail_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 4 5 { 6 7 //MessageBox.Show(""+sender.GetType().ToString()); 8 9 KryptonDataGridView kdgv = (KryptonDataGridView)sender; 10 11 if (e.Control.GetType().Equals(typeof(KryptonDataGridViewTextBoxEditingControl))) //cell类型 12 13 { 14 15 KryptonDataGridViewTextBoxEditingControl kcell = e.Control as KryptonDataGridViewTextBoxEditingControl; 16 17 //MessageBox.Show(kcell.TextBox.Name); 18 19 //获取列名 20 21 //MessageBox.Show(kdgv.Columns[kdgv.CurrentCell.ColumnIndex].Name); 22 23 if (kdgv.Columns[kdgv.CurrentCell.ColumnIndex].Name == "colProId")//此列为显示商品代码的列 24 25 { 26 27 //添加按键事件 28 29 kcell.TextChanged += new EventHandler(kcell_TextChanged); 30 31 } 32 33 } 34 35 } 36 37 代码 1 private void buttonSpecAny4_Click(object sender, EventArgs e) 2 3 { 4 5 //点击可查询 6 7 //MessageBox.Show("点击查询:"+buttonSpecAny4.Owner.GetType()); 8 9 KryptonDataGridViewTextBoxCell kdcell = (KryptonDataGridViewTextBoxCell)buttonSpecAny4.Owner; 10 11 BindDGV(""); 12 13 Rectangle rect = kDGVIndentDetail.GetCellDisplayRectangle(kdcell.ColumnIndex, kdcell.RowIndex, false); 14 15 _colindex = kdcell.ColumnIndex; 16 17 _rowindex = kdcell.RowIndex; 18 19 //设置显示控件的位置 20 21 dgv.Left = rect.Left; 22 23 dgv.Top = rect.Top + kdcell.Size.Height; 24 25 26 27 dgv.Visible = true; 28 29 } 30 31 代码 1 //下拉显示控件单元格双击事件,获得选择值并赋值给当前单元格 2 3 void dgv_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) 4 5 { 6 7 DataGridView dgv = (DataGridView)sender; 8 9 KryptonDataGridView kdgv = (KryptonDataGridView)dgv.Parent; 10 11 kdgv[_colindex,_rowindex].Value = dgv.CurrentRow.Cells["aa"].Value; 12 13 //隐藏 KryptonDataGridView 14 15 dgv.Visible = false; 16 17 //结束编辑,以显示选择结果值 18 19 kDGVIndentDetail.EndEdit(); 20 21 }