c#中datagridview,c#datagridview控件,C#开发WinForm之DataGridView开发详解

c#中datagridview,c#datagridview控件,C#开发WinForm之DataGridView开发详解

本文主要介绍了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: