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 }
时间: 2024-08-02 15:11:05

DataGridView单元格内容自动匹配下拉显示的相关文章

NPOI生成单元格(列)下拉框

客户提出能否将导入模板中,课程一列添加下拉框方便选择,不用手输入,以减少输入错误的可能性.于是在网上找了点代码,稍加整理后,形成了以下方案,代码部分: 一:生成课程列表,并放置在excel的单独sheet中. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 IList<CourseCodeInfo> list = StudentBus.GetSubjectInterface().GetList(0, "", "Name"); var Co

20161014001 DataGridView 单元格内容 自动计算

private void T_Form_CY_CBD_D_CellValueChanged(object sender, DataGridViewCellEventArgs e)        {            if (T_Form_CY_CBD_D.Rows.Count > 0 && e.RowIndex >= 0)            { // 计算制造成本的公式依据:工费率/产能/直通率.                 if (T_Form_CY_CBD_D.

利用java ajax以及js实现input框的模糊匹配下拉显示

前台jsp: <input type="text" name="bigCategoryName" id="bigCategoryName" AutoComplete="off" value="${bigCategoryName}" style="width:150px" maxlength="20" list="second" oninput

Excel单元格内容太多会覆盖遮住下一单元格范围

Excel单元格内容太多会覆盖遮住下一单元格范围分步阅读 Excel中的单元格内容,有着不同的对齐方式.用户可根据自己的需求,在处理数据的时候,自行设置所需要的对齐方式. 当您在处理数据的时候,如果设置不当,就会遇到这样的问题:Excel单元格内容太多会覆盖遮住下一单元格范围. 可以通过如下的方法来解决. 方法/步骤 如下图,B2单元格,仅输入了几个中文,但是,由于列的宽度不够,因此,该单元格的内容会延伸到下一单元格并覆盖了下一单元格的范围.从而影响了下一单元格的输入与修改. 此时,我们需要的方

C# DataGridView在单元格提示里(ToolTip)显示完整的单元格内容

当单元格内容太多时,则会忽略后面的内容 解决方案: 添加Dgv鼠标移到单元格事件时,设置当前单元格的ToolTipText属性内容为当前单元格内容 void From_Load(object sender, EventArgs e) { this.dgvSystemLog.ShowCellToolTips = true; this.dgvSystemLog.CellMouseEnter += new DataGridViewCellEventHandler(dgvSystemLog_CellMo

dataGridView设置单元格内容的显示格式CellFormatting

#region 设置单元格内容的显示格式 private void dataGridView_main_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { #region 会诊方式判断 int requestType_column_index = 9; if (e.ColumnIndex == requestType_column_index) { string sval = (e.Value ?? "&q

javascript生成表格增删改查 JavaScript动态改变表格单元格内容 动态生成表格 JS获取表格任意单元格 javascript如何动态删除表格某一行

jsp页面表格布局Html代码 <body > <center> <input type="text" value="111" id="mytext"> <table border="1" width="60%" id="mytable"> <tr> <td id="td1">第一行第一列<

134在单元格中自动排列指定的数据

效果如下: ViewController.h 1 #import <UIKit/UIKit.h> 2 3 @interface ViewController : UITableViewController 4 @property (strong, nonatomic) NSMutableArray *mArrDataList; 5 @property (strong, nonatomic) NSMutableArray *mArrSortedCollation; 6 7 @end ViewCo

自定义控件:DataGridView 单元格合并和二维表头

DataGridView单元格合并和二维表头应用: //DataGridView绑定数据 DataTable dt = new DataTable(); dt.Columns.Add("1"); dt.Columns.Add("2"); dt.Columns.Add("3"); dt.Columns.Add("4"); dt.Rows.Add("中国", "上海", "5000