DataGridView 设置汇总

第一部分 外观 

一、手动调整列与行宽,同时支持用户手动调整

      要实现这个功能不能通过设置DataGridView的AutoSizeColumnsMode属性(它的值有多个:None,NoSet,AllCells,ColumnHeader,DisplayedCells,Fill......等),因为这个属性一但设置为非None(不自动调整列头),或NoSet(继承父类的属性值,如果有),那所有列头虽然可以根据你设置的模式进行调整,但用户却不能手动调整了。

这里关键是要通过调用DataGridView的方法来实现:

1、自动调整列宽、行宽,调用:

DataGridView.AutoResizeColumns()  //调整所有列
DataGridView.AutoResizeColumn(int ColumnIndex)  //调整指定列

【注意】上面两个方法都有一个重载,可以传入自动宽度的模式:
DataGridViewAutoSizeColumnsMode(列)、DataGridViewAutoSizeRowsMode(行)

2、设置允许用户手动调整列宽、行宽。

DataGridView.AllowUserToResizeColumns = true  // 允许调整列宽
DataGridView.AllowUserToResizeRows = true  //允许调整行宽

-------------------------------------------------------

二、要调列头高度,行头宽度可以通过下面方法:

1、手动调整列头高度、行头宽度的前置条件

DataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;//要手动或用代码调整列的高度之前,必须将此属性设置为非DataGridViewColumnHeadersHeightSizeMode.AutoSize。DisableResizing:不允许手动调整(用户不能手动调整),AutoSize:系统自动调整(用户不能手动调整),EnableResizing:允许手动调整(系统不会自动调整)

同样,对于行头宽度则要先设置:DataGridView.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing


2、设置列头高度与行头宽度:

DataGridView.ColumnHeadersHeight = 20;//设置列头高度
DataGridView.RowHeadersWidth = 30;//设置行头宽度

需要注意的是:列头的宽度由列的宽度决定,行头的高度由行的高度决定

-------------------------------------------------------

三、DataGridViewCellStyle 样式属性(非常重要)

在这个样式属性里可以设置前景色、背景色、字体、对齐方式、边框等等……

1、五处可见的样式设置

  1. 表格级别的 DefaultCellStyle 属性:(优先级:0 最低)
    DataGridView.DefaultCellStyle 属性用于设置整个表格的默认单元格样式。这是默认的样式,如果没有为特定的行、列或单元格设置样式,则会应用该默认样式。

  2. 奇数行级别的 DefaultCellStyle 属性:(优先级:1)
    DataGridView.AlternatingRowsDefaultCellStyle 属性用于设置奇数行的默认单元格样式。如果为奇数行设置了 DefaultCellStyle 属性,则奇数行的所有单元格将应用该样式。

  3. 行级别的 DefaultCellStyle 属性:(优先级:2)
    DataGridViewRow.DefaultCellStyle 属性用于设置特定行的默认单元格样式。如果为某一行设置了 DefaultCellStyle 属性,则该行的所有单元格将应用该样式。

  4. 列级别的 DefaultCellStyle 属性:(优先级:3)
    DataGridViewColumn.DefaultCellStyle 属性用于设置特定列的默认单元格样式。如果为某一列设置了 DefaultCellStyle 属性,则该列的所有单元格将应用该样式。

  5. 单元格级别的 Style 属性:(优先级:4 最高)
    DataGridViewCell.Style 属性用于设置特定单元格的样式。如果为某个单元格设置了 Style 属性,则该单元格将应用该样式。

2、这些属性的优先级从高到低依次为:

单元格级别的 Style 属性 > 行级别的 DefaultCellStyle 属性 > 列级别的 DefaultCellStyle 属性 > 奇数行级别的 DefaultCellStyle 属性 > 表格级别的 DefaultCellStyle 属性

也就是说,如果为某个单元格设置了 Style 属性,则该单元格将应用该样式,而不管其他级别的样式设置。如果没有为某个单元格设置 Style 属性,则会依次检查行级别、列级别、奇数行级别和表格级别的样式设置,并应用找到的第一个非空样式。

四、DataGridView边框设置:

DataGridView边框设置

属性名优先级 ↓说明
1AdjustedTopLeftHeaderBorderStyle设置表格左上角单元格的高级边框样式
2AdvancedColumnHeadersBorderStyle1.1设置列头单元格的高级边框样式
3AdvancedRowHeadersBorderStyle1.2设置行头单元格的高级边框样式
4AdvancedCellBorderStyle1.3设置单元格的高级边框样式
5GridColor设置网格线的颜色
6BorderStyle设置整个表格的外边框样式
7ColumnHeadersBorderStyle1.1设置列标题行的边框样式
8RowHeadersBorderStyle1.2设置行标题列的边框样式
9CellBorderStyle1.3设置单元格的边框样式

DataGridView的边框设置非常灵活,用好上面的单元格样式及边框样式属性将能设计出非常漂亮的表格,一点不逊色于WEB网页上的表格

五、DataGridView的列头顺序会变动的解决方法

      绑定DataTable后,若DataTable的列进行了添加删除,造成每次刷新数据DataGridView的列头顺序会变动的解决方法:

DataGridView.AutoGenerateColumns = false; //将自动创建列属性设置为false

第二部分 数据展示

一、行与列的显示或隐藏

通过DataSource绑定到DataTable等数据集后,如果我们对要展示的内容进行调整或删除,一般不要去修改原数据集,而是通过隐藏和调整DataGridView的列或行的Visible属性来实现:

1、隐藏不需要展示的列或行:

                DataGridView.Columns[1].Visible = false; //不显示第1列
                DataGridView.Rows[1].Visible = false; //不显示第1行

2、将单元格的值格式化后再显示:

例如,我们有一列名为"Coldt_finish"的时间列,因为当时间类型直接输出时会出现如2023/8/7 的格式。而我们想输出2023-08-07 则可以设置表格或列或行的DefaultCellStyle.Format属性(当为单元格时Style.Format),此处Format 的格式用法,与 String.Format() 中的格式字符串相同。这对于输出展示内容非常有用,不但可以格式化输出还能控制占位。具体请另见用法。以下提供一个别人总结的链接:C#中string.format用法详解 - net-sky - 博客园 (cnblogs.com)

格式化输出示例:

dataGridView1.Columns["Coldt_finish"].DefaultCellStyle.Format = "yyyy-MM-dd";

数据类型要求:DateTime    数据:2023/8/7 16:57:21     输出:2023-08-07

dataGridView1.Columns["Colmoney"].DefaultCellStyle.Format = "N2";

数据类型要求:int float double decimal 等  数据:1366     输出:1,366.00

正常我们直接通过dataGridView1.Rows[i].["Colmoney"].Value 得到的都是object类型。这是因为DataGridView为了数据通用,把Cell单元格设置为了object类型以便能存放所有类型,而它内部的实际类型可以通过:dataGridView1.Rows[index].Cells[index].ValueType 或 GetType()方法获得。

Cell值的类型是由绑定到DataGridView的数据集中相应的列所决定的,而数据集中的列的类型又是由数据库中的表中的列类型所决定的。当然不同的数据库中的数据类型与C#中的数据类型可能并不一致,但是操作数据库的接口会提供数据类型的转换。如在sqlite中,date,time这两个类型都被转换为DataTime类型,integer 被转换为 int64 ,real被转为 double ,numeric,decimal被转为decimal 等。这需要查询不同的数据接口的操作,或者在你读取一次数据后,通过刚才介绍的方法dataGridView1.Rows[index].Cells[index].ValueType 来获取转换后的C#类型。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值