datagridview单元格内容自动匹配下拉显示.docx
《datagridview单元格内容自动匹配下拉显示.docx》由会员分享,可在线阅读,更多相关《datagridview单元格内容自动匹配下拉显示.docx(10页珍藏版)》请在冰豆网上搜索。
datagridview单元格内容自动匹配下拉显示
DataGridView单元格内容自动匹配下拉显示
Author:
很有意思
页面显示数据使用的控件是ComponentFactory.Krypton.Toolkit中的KryptonDataGridView控件。
在指定“商品”单元格中需要根据用户输入内容自动匹配数据库中商品信息,并且单元格处于编辑模式时显示一个查询图标的按钮,点击该按钮也将显示数据库中所有商品信息。
KryptonDataGridView显示控件此处命名为kDGVIndentDetail;
用于下拉显示匹配内容的DataGridView命名为dgv;
1、建立一个DataGridView类型的页面变量用于KryptonDataGridView单元格下拉显示匹配结果
//新建变量用于下拉显示的数据控件
DataGridViewdgv=newDataGridView();
//保存当前编辑单元格的坐标
privateint_colindex;//列索引
privateint_rowindex;//行索引
2、页面Load事件中设置dgv初始属性和添加一个单元格单击事件,提取为方法:
//设置下拉显示控件的属性
privatevoid_SetDGVDrop()
{
//初始为不可见并且只读
dgv.Visible=false;
dgv.ReadOnly=true;
dgv.Height=100;
//单元格选择模式为正行选择
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+=newDataGridViewCellMouseEventHandler(dgv_CellMouseClick);
//向明细单显示控件中加入该下拉控件
kDGVIndentDetail.Controls.Add(dgv);
}
dgv的单元格单击事件:
//下拉显示控件单元格双击事件,获得选择值并赋值给当前单元格
voiddgv_CellMouseClick(objectsender,DataGridViewCellMouseEventArgse)
{
DataGridViewdgv=(DataGridView)sender;
KryptonDataGridViewkdgv=(KryptonDataGridView)dgv.Parent;
kdgv[_colindex,_rowindex].Value=dgv.CurrentRow.Cells["aa"].Value;
//隐藏KryptonDataGridView
dgv.Visible=false;
//结束编辑,以显示选择结果值
kDGVIndentDetail.EndEdit();
}
3、数据显示控件kDGVIndentDetail的商品列(colProId)类型为:
KryptonDataGridViewTextBoxCell,在列的ButtonSpecs属性中添加一个buttonSpecAny名称为buttonSpecAny4,设置buttonSpecAny4的图片:
4、buttonSpecAny4的单击事件中显示下拉显示控件并调用控件的绑定事件:
privatevoidbuttonSpecAny4_Click(objectsender,EventArgse)
{
//点击可查询
//MessageBox.Show("点击查询:
"+buttonSpecAny4.Owner.GetType());
KryptonDataGridViewTextBoxCellkdcell=(KryptonDataGridViewTextBoxCell)buttonSpecAny4.Owner;
BindDGV("");
Rectanglerect=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;
}
当单元格为编辑状态时,buttonSpecAny4按钮将显示,点击该按钮下拉控件显示所有数据,点击控件的某一列,将把指定的值赋给当前编辑的单元格(这里只取选中行[“aa”]列的值)
5、dgv的绑定方法:
(为避免连接数据库,这里使用手工填充数据的方法)
//绑定下拉显示控件
privatevoidBindDGV(stringstr)
{
//填充数据源
DataTabledt=newDataTable();
dt.Columns.Add("aa");
dt.Columns.Add("bb");
dt.Columns.Add("cc");
dt.Columns.Add("ee");
DataRowdr=null;
for(inti=0;i<5;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;
}
6、现在实现在单元格直接输入内容时自动配备显示数据库中的内容,在kDGVIndentDetail显示控件的EditingControlShowing事件中处理:
//单元格启用编辑时
privatevoidkDGVIndentDetail_EditingControlShowing(objectsender,DataGridViewEditingControlShowingEventArgse)
{
//MessageBox.Show(""+sender.GetType().ToString());
KryptonDataGridViewkdgv=(KryptonDataGridView)sender;
if(e.Control.GetType().Equals(typeof(KryptonDataGridViewTextBoxEditingControl)))//cell类型
{
KryptonDataGridViewTextBoxEditingControlkcell=e.ControlasKryptonDataGridViewTextBoxEditingControl;
//MessageBox.Show(kcell.TextBox.Name);
//获取列名
//MessageBox.Show(kdgv.Columns[kdgv.CurrentCell.ColumnIndex].Name);
if(kdgv.Columns[kdgv.CurrentCell.ColumnIndex].Name=="colProId")//此列为显示商品代码的列
{
//添加按键事件
kcell.TextChanged+=newEventHandler(kcell_TextChanged);
}
}
}
TextChanged事件中根据用户数据内容动态匹配
voidkcell_TextChanged(objectsender,EventArgse)
{
KryptonDataGridViewTextBoxEditingControlkdgvtbox=(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;
Rectanglerect=kDGVIndentDetail.GetCellDisplayRectangle(_colindex,_rowindex,false);
//设置显示控件的位置
dgv.Left=rect.Left;
dgv.Top=rect.Top+kdgvtbox.Size.Height;
dgv.Visible=true;
}
}
7、滚动kDGVIndentDetail和改变列宽时,隐藏下拉显示控件
privatevoidkDGVIndentDetail_ColumnWidthChanged(objectsender,DataGridViewColumnEventArgse)
{
//隐藏下拉显示控件
dgv.Visible=false;
}
privatevoidkDGVIndentDetail_Scroll(objectsender,ScrollEventArgse)
{
//隐藏下拉显示控件
dgv.Visible=false;
}
暂且写到这里,还需要在使用中调试修改,下面是效果图:
单击单元格进入编辑模式时,查询按钮显示(放大镜)
输入内容时显示匹配内容。
点击放大镜显示所有内容