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


    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 }
    22
    23    

    缠非缠、禅非禅 枯木龙吟照大千
  • 相关阅读:
    VS2008 环境中完美搭建 Qt 4.7.4 静态编译的调试与发布 Inchroy's Blog 博客频道 CSDN.NET
    编写可丢弃的代码
    c++ using namespace std; 海明威 博客园
    解决MySQL server has gone away
    nginx upstream 调度策略
    (2006, 'MySQL server has gone away') 错误解决 dba007的空间 51CTO技术博客
    Linux IO模型漫谈(2) 轩脉刃 博客园
    redis源码笔记 initServer 刘浩de技术博客 博客园
    MySQLdb批量插入数据
    词库的扩充百度百科的抓取你知道这些热词吗? rabbit9898 ITeye技术网站
  • 原文地址:https://www.cnblogs.com/soany/p/5319043.html
Copyright © 2020-2023  润新知