DataGridView单元格内容自动匹配下拉显示

页面显示数据使用的控件是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 }

 

你可能感兴趣的:(datagridview)