第一部分 外观
一、手动调整列与行宽,同时支持用户手动调整
要实现这个功能不能通过设置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、五处可见的样式设置
-
表格级别的
DefaultCellStyle
属性:(优先级:0 最低)DataGridView.DefaultCellStyle
属性用于设置整个表格的默认单元格样式。这是默认的样式,如果没有为特定的行、列或单元格设置样式,则会应用该默认样式。 -
奇数行级别的
DefaultCellStyle
属性:(优先级:1)DataGridView.AlternatingRowsDefaultCellStyle
属性用于设置奇数行的默认单元格样式。如果为奇数行设置了DefaultCellStyle
属性,则奇数行的所有单元格将应用该样式。 -
行级别的
DefaultCellStyle
属性:(优先级:2)DataGridViewRow.DefaultCellStyle
属性用于设置特定行的默认单元格样式。如果为某一行设置了DefaultCellStyle
属性,则该行的所有单元格将应用该样式。 -
列级别的
DefaultCellStyle
属性:(优先级:3)DataGridViewColumn.DefaultCellStyle
属性用于设置特定列的默认单元格样式。如果为某一列设置了DefaultCellStyle
属性,则该列的所有单元格将应用该样式。 -
单元格级别的
Style
属性:(优先级:4 最高)DataGridViewCell.Style
属性用于设置特定单元格的样式。如果为某个单元格设置了Style
属性,则该单元格将应用该样式。
2、这些属性的优先级从高到低依次为:
单元格级别的 Style
属性 > 行级别的 DefaultCellStyle
属性 > 列级别的 DefaultCellStyle
属性 > 奇数行级别的 DefaultCellStyle
属性 > 表格级别的 DefaultCellStyle
属性
也就是说,如果为某个单元格设置了 Style
属性,则该单元格将应用该样式,而不管其他级别的样式设置。如果没有为某个单元格设置 Style
属性,则会依次检查行级别、列级别、奇数行级别和表格级别的样式设置,并应用找到的第一个非空样式。
四、DataGridView边框设置:
序 号 | 属性名 | 优先级 ↓ | 说明 |
---|---|---|---|
1 | AdjustedTopLeftHeaderBorderStyle | 无 | 设置表格左上角单元格的高级边框样式 |
2 | AdvancedColumnHeadersBorderStyle | 1.1 | 设置列头单元格的高级边框样式 |
3 | AdvancedRowHeadersBorderStyle | 1.2 | 设置行头单元格的高级边框样式 |
4 | AdvancedCellBorderStyle | 1.3 | 设置单元格的高级边框样式 |
5 | GridColor | 无 | 设置网格线的颜色 |
6 | BorderStyle | 无 | 设置整个表格的外边框样式 |
7 | ColumnHeadersBorderStyle | 1.1 | 设置列标题行的边框样式 |
8 | RowHeadersBorderStyle | 1.2 | 设置行标题列的边框样式 |
9 | CellBorderStyle | 1.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#类型。