• 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 }
  • 相关阅读:
    uva 12034 Race
    计算机基础之计算机硬件软件数据结构
    Project Perfect让Swift在server端跑起来-Perfect in Visual Studio Code (四)
    关于自己定义转场动画,我都告诉你。
    Shell编程入门
    CODEVS 1029 遍历问题
    【VBA研究】工作表自己主动筛选模式检測
    卸载MySQL 5.0
    操作系统(二)进程控制
    前端面试题
  • 原文地址:https://www.cnblogs.com/starksoft/p/3950670.html
Copyright © 2020-2023  润新知