文章目录
前言
用户界面 (UI) 设计人员经常发现需要向用户显示表格数据。 .NET Framework 提供了几种以表或网格形式显示数据的方法。 DataGridView 控件代表了该技术在 Windows 窗体应用程序中的最新发展。
DataGridView 控件提供一种以表格格式显示数据的功能强大且灵活的方法。 可以使用该控件显示小型到非常大型的数据集的只读或可编辑视图。
一.创建项目
创建一个名为dataGridViewTest的项目,拖入一个datagridView控件,名称为dataGridView1。
form大小为1000, 600;
dataGridView1大小为650, 350
效果图:
二.添加数据
初始化datagirdview1,添加一些数据进去
private void InitDataGridView()
{
//添加数据
DataTable dt = new DataTable();
dt.Columns.Add("学号");
dt.Columns.Add("姓名");
dt.Columns.Add("性别");
dt.Columns.Add("年纪");
dt.Columns.Add("数学");
dt.Columns.Add("地理");
dt.Columns.Add("物理");
dt.Rows.Add("001","刘大","男",33,90,90,90);
dt.Rows.Add("001", "关二", "男", 34, 96, 88, 96);
dt.Rows.Add("001", "张三", "男", 29, 98, 60, 95);
dt.Rows.Add("001", "赵四", "男", 29, 95, 90, 95);
dataGridView1.DataSource = dt;
}
效果图:
三.调整列宽
上图可以看到datagirdview有一部分没有显示出来,需要拖动滑动条才可以
设置列宽的两种方式:
1.直接指定列宽
在InitDataGridView
函数中继续添加代码
var columns = dataGridView1.Columns;
columns[0].Width = 30;
columns[1].Width = 50;
columns[2].Width = 60;
dataGridView1.Columns[3].Width = 30;//这样设置也是没有问题的
columns[4].Width = 30;
columns[5].Width = 30;
columns[6].Width = 30;
2.设置列宽自适应
在InitDataGridView
函数中继续添加代码
for (int i = 0; i < columns.Count; i++)
{
columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
此时自适应的效果会覆盖掉上一步指定的列宽。也就是说自适应宽度优先级>指定宽度优先级。
效果图:
而DataGridViewAutoSizeColumnMode的属性有八种不同的效果,如下表
名称 | 效果 | 简单的说 |
---|---|---|
NotSet | 列的大小调整行为从 System.Windows.Forms.DataGridView.AutoSizeColumnsMode 属性继承 | 就是默认大小 |
None | 列宽不会自动调整。 | 仅有一个初始列宽 |
ColumnHeader | 调整列宽,以适合列标题单元格的内容 | 仅适应标题的大小,列成员不去考虑 |
AllCellsExceptHeader | 调整列宽,以适合该列中的所有单元格的内容,不包括标题单元格 | 自适应列成员大小,不去考虑标题大小 |
AllCells | 调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,不包括标题单元格 | 自适应所有单元格的大小(费时间) |
DisplayedCellsExceptHeader | 调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,不包括标题单元格 | 行和列都考虑,除了标题 |
DisplayedCells | 调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,包括标题单元格 | 行和列都考虑 |
Fill | 调整列宽,使所有列的宽度正好填充控件的显示区域,只需要水平滚动保证列宽在 System.Windows.Forms.DataGridViewColumn.MinimumWidth属性值以上。相对列宽由相对 System.Windows.Forms.DataGridViewColumn.FillWeight 属性值决定 | 这个下面说 |
3.补充:
此时会发现上面的列表并未铺满真个datagirdview。
修改第2步代码:
for (int i = 0; i < columns.Count; i++)
{
if (i == columns.Count - 1)
{
columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
}
else
{
columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
}
此时最后一列用上方表格的最后一个属性,会发现最后一列会将整个表格铺满
效果图:
四.显示行号
1.添加行号
添加一个函数dataGridView1_RowStateChanged
private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
{
e.Row.HeaderCell.Value = string.Format("{0}", e.Row.Index + 1);
}
然后设置datagridview的RowStateChanged事件为 dataGridView1_RowStateChanged
运行程序会发现多出了行号:
2.去除行号旁边的三角标
这个三角表我看着是一点点都不舒服,耶稣来了也得去掉
在InitDataGridView
函数继续往下写
dataGridView1.RowHeadersDefaultCellStyle.Padding = new Padding(4);
这里的4
可以自己试一试,如果太小了去除不掉,太大了又会遮住行号
效果图:
3.修改行号列的大小
此时会发现行号所在的列是否有点儿大
方法1:设置自适应大小(不推荐,太丑)
属性 | 效果 |
---|---|
EnableResizing | 用户可以使用鼠标调整列标头的宽度 |
DisableResizing | 用户不能使用鼠标调整列标头的宽度 |
AutoSizeToAllHeaders | 为适应所有行标头单元格的内容大小而进行的行标头宽度调整 |
AutoSizeToDisplayedHeaders | 为适应当前显示的行中所有行标头的内容大小而进行的行标头宽度调整 |
AutoSizeToFirstHeader | 为适应第一个行标头的内容大小而进行的行标头宽度调整 |
方法2:指定行号大小
1.行号居中
2.设置行大小
在InitDataGridView
添加
dataGridView1.RowHeadersWidth = 30;
五.去除最后一行待添加的行
这一行是datagridview提供的待添加的行,这个不需要,干掉!
点击datagirdview控件,找到有伤角黑色三角标,展开之后,取消"启用添加
"选项即可
6.完整代码
目前仅用到这么多,后续用到会补充
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace dataGridViewTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
InitDataGridView();
}
private void InitDataGridView()
{
//添加数据
DataTable dt = new DataTable();
dt.Columns.Add("学号");
dt.Columns.Add("姓名");
dt.Columns.Add("性别");
dt.Columns.Add("年纪");
dt.Columns.Add("数学");
dt.Columns.Add("地理");
dt.Columns.Add("物理");
dt.Rows.Add("001","刘大","男",33,90,90,90);
dt.Rows.Add("001", "关二", "男", 34, 96, 88, 96);
dt.Rows.Add("001", "张三", "男", 29, 98, 60, 95);
dt.Rows.Add("001", "赵四", "男", 29, 95, 90, 95);
dataGridView1.DataSource = dt;
var columns = dataGridView1.Columns;
columns[0].Width = 30;
columns[1].Width = 50;
columns[2].Width = 60;
dataGridView1.Columns[3].Width = 30;//这样设置也是没有问题的
columns[4].Width = 30;
columns[5].Width = 30;
columns[6].Width = 30;
for (int i = 0; i < columns.Count; i++)
{
if (i == columns.Count - 1)
{
columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
}
else
{
columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
}
dataGridView1.RowHeadersDefaultCellStyle.Padding = new Padding(4);
dataGridView1.RowHeadersWidth = 30;
}
private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
{
e.Row.HeaderCell.Value = string.Format("{0}", e.Row.Index + 1);
}
}
}