页面显示数据使用的控件是ComponentFactory.Krypton.Toolkit中的KryptonDataGridView控件。在指定“商品”单元格中需要根据用户输入内容自动匹配数据库中商品信息,并且单元格处于编辑模式时显示一个查询图标的按钮,点击该按钮也将显示数据库中所有商品信息。

KryptonDataGridView显示控件此处命名为kDGVIndentDetail;

用于下拉显示匹配内容的DataGridView命名为dgv;

、建立一个DataGridView类型的页面变量用于KryptonDataGridView单元格下拉显示匹配结果

 //新建变量用于下拉显示的数据控件

 DataGridView dgv = new DataGridView();

  //保存当前编辑单元格的坐标

 private int _colindex;//列索引

 private int _rowindex;//行索引

、页面Load事件中设置dgv初始属性和添加一个单元格单击事件,提取为方法:

代码  //设置下拉显示控件的属性

 private void _SetDGVDrop()

 {

 //初始为不可见并且只读

 dgv.Visible = false;

 dgv.ReadOnly = true;

 dgv.Height = ;

 //单元格选择模式为正行选择

 dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

 dgv.MultiSelect = false; //只用单行选择

 dgv.ColumnHeadersVisible = false; //隐藏列头

 //设置列宽

 dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

 dgv.BackgroundColor = Color.FromName("window");

 dgv.RowHeadersVisible = false; //隐藏行头

 dgv.ScrollBars = ScrollBars.Vertical;//滚动条模式

 dgv.AllowUserToAddRows = false; //禁止添加新行

 dgv.AllowUserToDeleteRows = false;

 dgv.AllowUserToOrderColumns = false;

 dgv.AllowUserToResizeColumns = false;

 dgv.AllowUserToResizeRows = false;

 dgv.BackgroundColor = Color.White;

 //设置单元格边框样式

 dgv.AdvancedCellBorderStyle.Left = DataGridViewAdvancedCellBorderStyle.None;

 dgv.AdvancedCellBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.Single;

 dgv.AdvancedCellBorderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.None;

 dgv.AdvancedCellBorderStyle.Top = DataGridViewAdvancedCellBorderStyle.None;

 //添加单元格鼠标单击事件

 dgv.CellMouseClick += new DataGridViewCellMouseEventHandler(dgv_CellMouseClick);

 //向明细单显示控件中加入该下拉控件

 kDGVIndentDetail.Controls.Add(dgv);

 }

dgv的单元格单击事件:

、数据显示控件kDGVIndentDetail的商品列(colProId)类型为:KryptonDataGridViewTextBoxCell,在列的ButtonSpecs属性中添加一个buttonSpecAny名称为buttonSpecAny4,设置buttonSpecAny4的图片:

、buttonSpecAny4的单击事件中显示下拉显示控件并调用控件的绑定事件:

  当单元格为编辑状态时,buttonSpecAny4按钮将显示,点击该按钮下拉控件显示所有数据,点击控件的某一列,将把指定的值赋给当前编辑的单元格(这里只取选中行[“aa”]列的值)

、dgv的绑定方法:(为避免连接数据库,这里使用手工填充数据的方法)

代码  //绑定下拉显示控件

 private void BindDGV(string str)

 {

 //填充数据源

 DataTable dt = new DataTable();

 dt.Columns.Add("aa");

 dt.Columns.Add("bb");

 dt.Columns.Add("cc");

 dt.Columns.Add("ee");

 DataRow dr = null;

 for (int i = ; i < ; i++)

 {

 dr = dt.NewRow();

 dr["aa"] = str + "aa" + i;

 dr["bb"] = str + "bb" + i;

 dr["cc"] = str + "cc" + i;

 dr["ee"] = str + "ee" + i;

 dt.Rows.Add(dr);

 }

  //绑定数据源 

 dgv.DataSource = dt;

 }

、现在实现在单元格直接输入内容时自动配备显示数据库中的内容,在kDGVIndentDetail显示控件的EditingControlShowing事件中处理:

  TextChanged事件中根据用户数据内容动态匹配

代码  void kcell_TextChanged(object sender, EventArgs e)

 {

 KryptonDataGridViewTextBoxEditingControl kdgvtbox = (KryptonDataGridViewTextBoxEditingControl)sender;

 //MessageBox.Show(kdgvtbox.Text);

 if (kDGVIndentDetail.Columns[kDGVIndentDetail.CurrentCell.ColumnIndex].Name == "colProId")

 {

 BindDGV(kdgvtbox.Text);

 _colindex = kDGVIndentDetail.CurrentCell.ColumnIndex;

 _rowindex = kDGVIndentDetail.CurrentCell.RowIndex;

 Rectangle rect = kDGVIndentDetail.GetCellDisplayRectangle(_colindex, _rowindex, false);

 //设置显示控件的位置

 dgv.Left = rect.Left;

 dgv.Top = rect.Top + kdgvtbox.Size.Height;

 dgv.Visible = true;

 }

 }

、滚动kDGVIndentDetail和改变列宽时,隐藏下拉显示控件

代码  private void kDGVIndentDetail_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e)

 {

 //隐藏下拉显示控件

 dgv.Visible = false;

 }

 private void kDGVIndentDetail_Scroll(object sender, ScrollEventArgs e)

 {

 //隐藏下拉显示控件

 dgv.Visible = false;

 }

暂且写到这里,还需要在使用中调试修改,下面是效果图:

单击单元格进入编辑模式时,查询按钮显示(放大镜)

输入内容时显示匹配内容:

点击放大镜显示所有内容:

代码  //单元格启用编辑时

 private void kDGVIndentDetail_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)

 {

 //MessageBox.Show(""+sender.GetType().ToString());

 KryptonDataGridView kdgv = (KryptonDataGridView)sender;

 if (e.Control.GetType().Equals(typeof(KryptonDataGridViewTextBoxEditingControl))) //cell类型

 {

 KryptonDataGridViewTextBoxEditingControl kcell = e.Control as KryptonDataGridViewTextBoxEditingControl;

 //MessageBox.Show(kcell.TextBox.Name);

 //获取列名

 //MessageBox.Show(kdgv.Columns[kdgv.CurrentCell.ColumnIndex].Name);

 if (kdgv.Columns[kdgv.CurrentCell.ColumnIndex].Name == "colProId")//此列为显示商品代码的列

 { 

 //添加按键事件

 kcell.TextChanged += new EventHandler(kcell_TextChanged);

 }

 }

 }

 代码  private void buttonSpecAny4_Click(object sender, EventArgs e)

 {

 //点击可查询

 //MessageBox.Show("点击查询:"+buttonSpecAny4.Owner.GetType());

 KryptonDataGridViewTextBoxCell kdcell = (KryptonDataGridViewTextBoxCell)buttonSpecAny4.Owner;

 BindDGV("");

 Rectangle rect = kDGVIndentDetail.GetCellDisplayRectangle(kdcell.ColumnIndex, kdcell.RowIndex, false);

 _colindex = kdcell.ColumnIndex;

 _rowindex = kdcell.RowIndex;

 //设置显示控件的位置

 dgv.Left = rect.Left;

 dgv.Top = rect.Top + kdcell.Size.Height;

 dgv.Visible = true;

 }

代码  //下拉显示控件单元格双击事件,获得选择值并赋值给当前单元格

 void dgv_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)

 {

 DataGridView dgv = (DataGridView)sender;

 KryptonDataGridView kdgv = (KryptonDataGridView)dgv.Parent;

 kdgv[_colindex,_rowindex].Value = dgv.CurrentRow.Cells["aa"].Value;

 //隐藏 KryptonDataGridView

 dgv.Visible = false;

 //结束编辑,以显示选择结果值

 kDGVIndentDetail.EndEdit();

 }

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

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

    客户提出能否将导入模板中,课程一列添加下拉框方便选择,不用手输入,以减少输入错误的可能性.于是在网上找了点代码,稍加整理后,形成了以下方案,代码部分: 一:生成课程列表,并放置在excel的单独she ...

  2. 20161014001 DataGridView 单元格内容 自动计算

    private void T_Form_CY_CBD_D_CellValueChanged(object sender, DataGridViewCellEventArgs e)        {   ...

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

    Excel单元格内容太多会覆盖遮住下一单元格范围分步阅读 Excel中的单元格内容,有着不同的对齐方式.用户可根据自己的需求,在处理数据的时候,自行设置所需要的对齐方式. 当您在处理数据的时候,如果设 ...

  4. DataGridView 单元格自动填充

    在DataGridView单元格中,当输入指定字符时,自动完成填充. 通过 TextBox实现 AutoCompleteMode AutoCompleteMode.Suggest: AutoCompl ...

  5. WinForm中DataGridView复制选中单元格内容解决方案

    WinForm中DataGridView鼠标选中单元格内容复制方案 1.CTR+C快捷键复制 前提:该控件ClipboardCopyMode属性设置值非Disable: 2.鼠标框选,自定义代码实现复 ...

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

    当单元格内容太多时,则会忽略后面的内容 解决方案: 添加Dgv鼠标移到单元格事件时,设置当前单元格的ToolTipText属性内容为当前单元格内容 void From_Load(object send ...

  7. excel单元格内容拆分

    这几天在整理数据,但是数据都在表格的一个单元格中,看起来很不方法,所以在网上找到excel单元格内如拆分的方法,并亲测有效 介绍2种拆分的方法 方法一: (1)在B1输入公式=right(text,[ ...

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

    jsp页面表格布局Html代码 <body onload="show()"> <center> <input type="text" ...

  9. C#实例:datagridview单元格合并

    这是替C#微信交流群群友做的一个小实例,目的就是在datagridview选择对应行以后,点击button后获取对应行的ip,并执行相应的操作,其实我觉得这样的话button没必要非放置到datagr ...

随机推荐

  1. 基于HTML5技术的电力3D监控应用(四)

    回答了知乎问题较长,一些使用WebGL的经验,作为新的一篇: 正好逛到这个问题,正好是2013年底,正好最近基于的HT for Web 3D做的电力项目收尾,正好用到的就是WebGL技术,因此说说自己 ...

  2. 【Beta阶段】团队源代码管理

    0. 快速上手与理解 如果你的团队来了一个新队员,有一台全新的机器,你们是否有一个文档,只要设置了相应的权限,她就可以根据文档,从头开始搭建环境,并成功地把最新.最稳定版本的软件编译出来,并运行必要的 ...

  3. IOS 之 PJSIP 笔记(一) 编译多平台支持的静态库

    好久没有写博客了,这也算是我步入新工作后的第一篇技术博文吧.在进入新公司前,早就有了技术层进入下一个迭代的准备,但很多事情是意想不到的,就像我以 C# 程序员的身份面试入职的,而今却是一个全职的 IO ...

  4. 【iOS】FMDB封装,查询自动mapping

    sqlite几乎所有的App都会用到,但是系统自带的sqlite API是用C语言写的,非常不友好,用起来非常不便,通常我们使用第三方封装好的工具,例如:FMDB(https://github.com ...

  5. Python入门笔记(24):Python面向对象(1)速成

    一.Python经典类与新类 经典类:如果没有直接或间接的子类化一个对象,也就是说如果没有指定一个父类,或者是如果子类化的基本类没有父类,那么就定义了经典类: class classics: 'def ...

  6. js获取url传递的参数

    获取URL带参数的JAVASCRIPT客户端解决方案 一.正则分析法.(我较喜欢使用正则)function GetQueryString(name) {var reg = new RegExp(“(^ ...

  7. 在windows下配置Eclipse + go环境

    http://blog.csdn.net/hengyunabc/article/details/7371446 本文章地址:http://blog.csdn.net/hengyunabc/articl ...

  8. Linux下centos系统安装redis和php-redis

    源地址:http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm  //此为centos 6版本 安装输入 ...

  9. poi excel export 乱码

    1. Question Description: ~前端是get方式提交的,参数含有中文“测试” ~导出的excel,文件名正常, 而标题乱码 2. Solution: ~断点发现, 参数接收就是乱码 ...

  10. SQL数据库基础(八)

    连接查询:通过连接运算符可以实现多个表查询.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 常用的两个链接运算符: 1.join   on 2.union     在关 ...