本文主要介绍了C#开发WinForm的DataGridView开发的详细讲解,通过示例代码详细介绍,对大家的学习或工作有一定的参考价值。有需要的朋友下面跟边肖学习。
目录
前言直接增加基础数据渲染。每个单元格类型都是由dataGridViewTextBoxCell直接增加的,但是我们可以指定单元格类型。使用vo对象DataGridView列宽自适应禁止缩放单元格大小。可以编辑单元格行标题,列标题不显示,列表显示不完整吗?必须通过将鼠标移动到组件上来显示的bug会显示行号。禁止自动创建列。选择单元类型修改。编辑datagridview datagridviewcheckboxcolumn时,会实时触发其他选定的事件。
前言
DataGridView是开发Winform的列表显示,类似于表格。学习以下基本功能的用法,辅以经验,基本功能的开发是没问题的。
基本的数据渲染
根据提供的数据展示效果。
提供DataGridView数据源的方法有很多,大致如下:
直接增加,每个单元格类型都是DataGridViewTextBoxCell
int index=this . datagridview 1 . rows . add();
this.dataGridView1.Rows[index]。单元格[0]。value=“1”;
this.dataGridView1.Rows[index]。单元格[1]。value=“2”;
this.dataGridView1.Rows[index]。单元格[2]。value=“3”;
直接添加一行,在该行的日常单元格中添加数据,缺点是过于单一。
直接增加,但我们可以指定单元格类型
datagridview row row=new datagridview row();
DataGridViewTextBoxCell textboxcell=new DataGridViewTextBoxCell();
textboxcell。Value=' aaa
划。cells . Add(textbox cell);
DataGridViewComboBoxCell combox cell=new DataGridViewComboBoxCell();
划。cells . Add(combox cell);
dataGridView1。rows . Add(row);
可选类型如下:
使用vo对象
以上两个都不是我想要的,因为列表中显示的大部分数据都是复杂的后台数据。所以我建议用Vo。
创建新的InfoVo.cs类
公共类InfoVo
{
///摘要
///
////摘要
公共字符串uidItem { get设置;}
///摘要
///
////摘要
公共字符串uidItemRevision { get设置;}
///摘要
///
////摘要
公共字符串primaryTag { get设置;}
}
构造一个列表,将InfoVo放入List对象,然后将List对象赋给dataGridView。数据源
在窗体的Load事件中添加以下代码
私有void SearchInfo_Load(对象发送方,EventArgs e)
{
ListInfoVo list=new ListInfoVo();
列表。Add(new InfoVo(){ uidItem='1 ',uidItemRevision='1 ',primary tag=' 1 ' });
列表。Add(new InfoVo(){ uidItem='2 ',uidItemRevision='2 ',primary tag=' 2 ' });
dataGridView。AutoGenerateColumns=false
dataGridView。DataSource=null
dataGridView。DataSource=list
}
您可以简单地分配dataGridView。数据源=列表。这里的AutoGenerateColumns禁止dataGridView根据vo属性自动创建列。
在窗体上选择DataGridView,然后单击属性面板中的“列”选项。如下图
在打开的面板中,我们可以创建列。选择它是否可见,并设置头部。
DataPropertyName:指定列绑定的数据源属性字段。
在DolumnType中,我们可以指定单元格类型,如下所示。
例如下拉框或单元格框。
此时,我们可以呈现DataGridView组件了。我们来看一些属性。
dataGridView
列宽自适应
foreach(dataGridView中的DataGridViewColumn列。列)
{
专栏。autosize mode=datagridview autosize columnmode。AllCells
}
成员名称
解释
NotSet
列的调整大小行为是从datagridview . autosize columns mode属性继承的。
没有人
列宽不会自动调整。
所有细胞
调整列宽以适合列中所有单元格的内容,包括标题单元格。
AllCellsExceptHeader
调整列宽以适合列中所有单元格的内容,标题单元格除外。
显示的单元格
调整列宽以适合当前屏幕上显示的行的列中所有单元格的内容,包括标题单元格。
DisplayedCellsExceptHeader
调整列宽以适合当前屏幕上显示的行的列中所有单元格的内容,标题单元格除外。
列标题
调整列宽以适合列标题单元格的内容。
充满
调整列宽,使所有列的宽度刚好填满控件的显示区域,并且仅水平滚动以确保列宽在datagridviewcolumn . minimum width的属性值之上。相对列宽由相对datagridview column确定。FillWeight属性值。
专栏。autosize mode=datagridviewwautsecolumnmode。如果希望列宽按比例填充显示区域,请选择fill;
禁止缩放单元格大小
2个属性
allowusertorizecolumns:true:禁止缩放列。
allowusertorizerows:true:禁止缩放行。
用户自定义列的顺序
您可以通过拖动来对列进行排序。
AllowUserToOrderColumns:true
是否可以编辑单元格
表单的只读是假的
在列中弹出的列编辑窗口中,选择列只读为假。
SelectionMode是RowReadSelect(这是默认值)
行头,列头不显示
在属性面板中选择RowheadersVisible和ColumnHeadersVisible,并将它们设置为false。
列表显示不完全,必需鼠标移到组件上才能显示的bug
将RowheadersVisible设置为false。
行头显示行号
为RowStateChanged事件添加一个监视器(查看属性面板右侧的闪电图标)。
私有void datagridview 1 _ RowStateChanged(对象发送方,DataGridViewRowStateChangedEventArgs e)
{
//显示在HeaderCell上
for(int I=0;I this . datagridview 1 . rows . count;我)
{
datagridview row r=this . datagridview 1 . rows[I];
r.HeaderCell.Value=string。格式(“{0}”,I 1);
}
this . datagridview 1 . refresh();
}
行号显示不完整的解决方法是将DataGridView的RowHeadersWidthSizeMode属性设置为AutoSizeToAllHeaders、AutoSizeToDisplayedHeaders或AutoSizeToFirstHeader。
禁止自动创建列
如果我们提供vo对象,dataGrid会根据属性自动创建列,这不是我想要的。我希望能够控制显示器。设置如下。
dataGridView。AutoGenerateColumns=false
修改单元格类型
单元格可以显示文件、单元格框、下拉框、图片和超链接。只需在编辑列窗口中选择ColumnType下拉框并选中它。当然,不同的选择和不同的数据设置,如
单框DataGridViewCheckBoxColumn如下所示
下拉框DataGridViewComboBoxColumn
选中模式
您可以指定是选择整行还是每个小单元格。
SelectionMode,所有选项如下
其它
当然还有其他的。只要我们熟悉,几乎可以在属性面板上找到。
选中事件
CellClick是选中的事件,所以不要使用它。不要使用CellContentClick,因为如果单元格没有内容,将不会触发CellContentClick事件。
获取当前单元格的内容:datagridview 1 . current cell . value
获取当前单元格的列索引:datagridview 1 . current cell . column index
获取当前单元格的行索引。
获取当前行:dataGridView。当前行;
获得的绑定vo:
DataGridViewRow dataGridView row=dataGridView。当前行;
InfoVo infoVo=dataGridViewRow。DataBoundItem为InfoVo
infoVo。uidItemRevision
如果表格可以编辑,那么编辑完表格后,DataBoundItem绑定的vo对象会同步更新。
遍历列表中的所有单元格。
foreach(dataGridView中的DataGridViewRow项。行)
{
//item是每行的对象,cells是单元格的集合。
if (null!=项目。单元格[0]。值(布尔型)项。单元格[0]。值)
{
项目。cells[0]. value . tostring();
}
}
使用datagridview . current cell address属性而不是直接访问单元格来确定单元格的位置。
行:datagridview . current cell address . y
列:datagridview . current cell address . x。
的CurrentCell可以通过设置DataGridView对象的currentcell来更改。它可以由CurrentCell设置。
DataGridView的活动单元格。将CurrentCell设置为Nothing(null)可以停用激活的单元格。
DataGridView DataGridViewCheckBoxColumn编辑时实时触发事件
正常响应单元格值已更改()事件时,当改变检验盒状态时,只有当焦点离开该单元格时才能触发单元格值已更改()事件,
如果要改变检验盒值时实时触发单元格值已更改()事件,需要借用CurrentCellDirtyStateChanged()事件来提交未提交控件的更改。
private void datagridview 1 _ CurrentCellDirtyStateChanged(对象发送方,EventArgs e)
{
if (dataGridView1 .IsCurrentCellDirty)
{
dataGridView1 .提交编辑(DataGridViewDataErrorContexts .提交);
}
}
事实上,当调用dataGridView1 .提交编辑(DataGridViewDataErrorContexts .提交);时,就提交了当前的修改,很多其它事件都会有响应,其中单元格值已更改就是其中之一。
这样单元格值已更改()事件就可以随着检验盒的值的改变实时触发。
以全选/反选为例说明当DataGridViewCheckBoxColumn发生变化时怎么处理全选/反选。
检验盒有3种状态:选中(检查状态.已检查)/取消(检查状态.未选中)/部分选中(检查状态.不确定)
在winForm组件里拖拽一个检验盒命名为选择所有复选框,文本为全选,拖拽一个链接标签命名为revSelectLinkLbl,文本为反选。
//全选
私有void选择所有复选框_选中已更改(对象发送方,事件参数e)
{
复选框c=发件人作为复选框;
if(c.CheckState==CheckState .已检查)
{
ChangeDataSourceChecked(true);
}
else if(c . CheckState==CheckState .未选中)
{
ChangeDataSourceChecked(false);
}
}
私有void ChangeDataSourceChecked(布尔值被选中)
{
foreach(数据源中的saveplmmbomresponsevo)
{
saveplmbomresponsevo。检查EDC=是否已选中;
}
dataGridView .数据源=空
dataGridView .数据源=数据源;
}
///摘要
///反选
////摘要
///param name='sender'/param
///param name='e'/param
私有void revSelectLinkLbl _ link已单击(对象发送方,LinkLabelLinkClickedEventArgs e)
{
如果(这个。选择所有复选框。检查状态==检查状态.已检查)
{
这个。选择所有复选框。检查状态=检查状态.未检查;
}
else if(这个。选择所有复选框。检查状态==检查状态.未选中)
{
这个。选择所有复选框。检查状态=检查状态.已检查;
}
其他
{
//部分选中
foreach(数据源中的saveplmmbomresponsevo)
{
if(saveplmbomresponsevo。checkedc)
{
saveplmbomresponsevo。checkedc=false
}
其他
{
saveplmbomresponsevo。checkedc=true
}
}
dataGridView .数据源=空
dataGridView .数据源=数据源;
}
}
///摘要
///处理数据源数据变化时,全选/反选选中状态
////摘要
私有void calSelectAllCheckBoxState()
{
int选择计数=0;
foreach(数据源中的saveplmmbomresponsevo)
{
if(saveplmbomresponsevo。checkedc)
{
选择的计数
}
}
if (selectedCount==0)
{
如果(这个。选择所有复选框。checkstate!=检查状态。未选中)
{
这个。选择所有复选框。检查状态=检查状态.未检查;
}
}
else if(选择的计数==数据源.计数)
{
如果(这个。选择所有复选框。checkstate!=检查状态。已检查)
{
这个。选择所有复选框。检查状态=检查状态.已检查;
}
}
其他
{
如果(这个。选择所有复选框。checkstate!=检查状态。不确定)
{
这个。选择所有复选框。检查状态=检查状态.不确定;
}
}
}
///摘要
///提交修改状态
////摘要
///param name='sender'/param
///param name='e'/param
private void DataGridView _ CurrentCellDirtyStateChanged(对象发送方,EventArgs e)
{
如果(这个。datagridview。iscurrentcelldirty)
{
这个。datagridview。提交编辑(DataGridViewDataErrorContexts .提交);
}
}
//行值变化
私有void DataGridView _ cell值已更改(对象发送方,DataGridViewCellEventArgs e)
{
calSelectAllCheckBoxState();
}
以上就是本文对C# DataGridView开发WinForm的详细讲解。有关C# DataGridView开发的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。