C# Winform DataGridView 控件和 DataTable

目录

一、概述

二、DataTable 的用法

1.创建表和列

2.添加行

3.取值和赋值

4.删除行

5.遍历 DataTable

6.判断 DataTable 列中是否存在某个值

7.设置主键

8.获取 DataRow 所在的行号

9.DataTable 转换为 List

10.将 List 转 DataTable

三、DataGridView 的用法

1.绑定数据

2.获取绑定的数据源

3.获取 / 设置 选中单元格的数据

4.设置单元格的宽高

结束


一、概述

DataGridView 控件提供用于显示数据的可自定义表。 类 DataGridView 允许通过使用属性(如 DefaultCellStyle、 ColumnHeadersDefaultCellStyle、 CellBorderStyle和)自定义单元格、行、列和 GridColor边框。 有关详细信息,请参阅微软 DataGridView 控件中的基本格式设置和样式设置。

可以使用 DataGridView 控件在基础数据源中或不使用基础数据源显示数据。 如果不指定数据源,可以创建包含数据的列和行,并将其直接添加到 DataGridView using Rows and Columns properties。 还可以使用 Rows 集合访问 DataGridViewRow 对象和 DataGridViewRow.Cells 属性来直接读取或写入单元格值。 索引 Item[] 器还提供对单元格的直接访问。

作为手动填充控件的替代方法,可以设置 DataSource 属性 DataMember 以绑定到 DataGridView 数据源并自动填充数据。 有关详细信息,请参阅微软 DataGridView 控件中显示数据。

处理大量数据时,可以将属性设置为 VirtualModetrue 显示可用数据的子集。 虚拟模式需要实现在其中填充控件的数据缓存 DataGridView 。 

二、DataTable 的用法

1.创建表和列

使用 new DataTable() 来创建一个 DataTable 表,创建表可以加上表名,也可以不加

DataTable dt = new DataTable();
DataTable dt1 = new DataTable("Datas");

DataTable 表 和我们常用的 Excel 是一样的,如下图,列就是 A,B,C,D.....   行就是 1,2,3,4..... 

只是 DataTable 在创建后,是空的,既没有自动创建的列,也没有自动创建的行,这些都是要我们通过代码来实现的。

创建列通过 实例化 DataColumn 类,并 DataColumn 类 添加到 DataTable.Columns 中来实现添加一列。

DataTable dt = new DataTable("Datas");
DataColumn dc1 = new DataColumn("商品编号");
DataColumn dc2 = new DataColumn("商品名称");
DataColumn dc3 = new DataColumn("商品重量");
DataColumn dc4 = new DataColumn("商品价格");
DataColumn dc5 = new DataColumn("购买数量");
dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
dt.Columns.Add(dc3);
dt.Columns.Add(dc4);
dt.Columns.Add(dc5);

在添加列的同时,可以给列添加一些设置

DataTable dt = new DataTable("Datas");
DataColumn dc1 = new DataColumn("商品编号");
DataColumn dc2 = new DataColumn("商品名称");
DataColumn dc3 = new DataColumn("商品重量");
DataColumn dc4 = new DataColumn("商品价格");
DataColumn dc5 = new DataColumn("购买数量");dc1.AutoIncrement = true;//自动增加
dc1.AutoIncrementSeed = 1;//起始为1
dc1.AutoIncrementStep = 1;//步长为1
dc1.AllowDBNull = false;//是否允许空值dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
dt.Columns.Add(dc3);
dt.Columns.Add(dc4);
dt.Columns.Add(dc5);

只是这么做比较繁琐,因此不推荐。

推荐用下面方式去添加列

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));dataGridView1.DataSource = dt;

效果:

可以看到,DataGridView 在绑定 DataTable 后会默认出现一个空白的行你可能会有疑问,是不是这句代码导致的,如下:

dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值

开始测试:

private void Form1_Load(object sender, EventArgs e)
{DataTable dt = new DataTable("Datas");//添加列dt.Columns.Add("姓名", typeof(string));dt.Columns.Add("年龄", typeof(int));dt.Columns.Add("身高", typeof(float));dt.Columns.Add("体重", typeof(float));dt.Rows.Add("2号", 12, 220, 300);dataGridView1.DataSource = dt;
}

效果:

所以实验证明,用 DataTable 绑定数据,是会默认添加一个空白行的,如果不想表格中有空白行,可以使用  List<类> 这种方式去绑定,参考下面代码:

using System;
using System.Collections.Generic;
using System.Windows.Forms;namespace DateTable的使用
{public partial class Form1 : Form{public Form1(){InitializeComponent();}List<dog> doglist = new List<dog>();private void Form1_Load(object sender, EventArgs e){doglist.Add(new dog() { name = "dog1", age = 1, color = "bule", gender = 1 });doglist.Add(new dog() { name = "dog2", age = 2, color = "green", gender = 0 });doglist.Add(new dog() { name = "dog3", age = 3, color = "red", gender = 1 });dataGridView1.DataSource = doglist;}}
}public class dog
{public string name { get; set; }public int age { get; set; }public string color { get; set; }public int gender { get; set; }
}

效果:

2.添加行

通过添加 DataRow 类来添加行,如下:

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));//添加行
DataRow newRow = dt.NewRow();
newRow["姓名"] = "1号";
newRow["年龄"] = "17";
newRow["身高"] = "155";
newRow["体重"] = "220";
dt.Rows.Add(newRow);dataGridView1.DataSource = dt;

运行:

这么写虽然可以实现添加行,但用起来很繁琐, 当然也有简洁的写法

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));//添加行
dt.Rows.Add("2号", 12, 220, 300);dataGridView1.DataSource = dt;

运行:

这里添加行的写法,也可以换成下面的写法,效果是一样的

dt.Rows.Add(new object[] { "2号", 12, 220, 300 });

3.取值和赋值

在获取和设置这些数据之前,先添加一些数据

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值//添加列
dc = dt.Columns.Add("姓名", typeof(string));
dc = dt.Columns.Add("年龄", typeof(int));
dc = dt.Columns.Add("身高", typeof(float));
dc = dt.Columns.Add("体重", typeof(float));//添加行
dt.Rows.Add("1号", 17, 155, 220);
dt.Rows.Add("2号", 12, 220, 300);
dt.Rows.Add("3号", 45, 170, 132);dataGridView1.DataSource = dt;

运行:

1)赋值

通过索引号赋值

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));//添加行
dt.Rows.Add("1号", 17, 155, 220);
dt.Rows.Add("2号", 12, 220, 300);
dt.Rows.Add("3号", 45, 170, 132);dataGridView1.DataSource = dt;//1)赋值
dt.Rows[0][0] = "张三";

运行:

注意这里,dt.Rows[0] 是指第几行, 第二个 0 才是指第几列,如果将 dt.Rows[0] 改为 dt.Rows[1] 效果如下:

通过列名赋值

dt.Rows[0] 里面的行号的定义只能用数字去定义,但是后面的列可以用列名去获取

dt.Rows[0]["姓名"] = "张三";

效果:

2)取值

取值和获取值用法和变量的用法差不多,只是返回来的类型是 object 类型,做一下转换就好了

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));//添加行
dt.Rows.Add("1号", 17, 155, 220);
dt.Rows.Add("2号", 12, 220, 300);
dt.Rows.Add("3号", 45, 170, 132);dataGridView1.DataSource = dt;//2)取值           
object name = dt.Rows[0]["姓名"];
object age = dt.Rows[0][1];
Console.WriteLine(name);
Console.WriteLine(age);

运行:

4.删除行

删除行有多中写法,可以使用 dt.Rows.Remove(dt.Rows[0]);

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));//添加行
dt.Rows.Add("1号", 17, 155, 220);
dt.Rows.Add("2号", 12, 220, 300);
dt.Rows.Add("3号", 45, 170, 132);//删除行
dt.Rows.Remove(dt.Rows[0]);dataGridView1.DataSource = dt;

也可以使用 dt.Rows.RemoveAt(0)  效果是一样的

dt.Rows.RemoveAt(0);

运行:

5.遍历 DataTable

列名,和表格的内容遍历是分开的

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));//添加行
dt.Rows.Add("1号", 17, 155, 220);
dt.Rows.Add("2号", 12, 220, 300);
dt.Rows.Add("3号", 45, 170, 132);//打印所有列名
string columnName = string.Empty;
for (int i = 0; i < dt.Columns.Count; i++)
{columnName += string.Format("{0}({1}) | ", dt.Columns[i].ColumnName, i);
}
Console.WriteLine(columnName);//打印每一行的数据
foreach (DataRow row in dt.Rows)
{string columnStr = string.Empty;foreach (DataColumn column in dt.Columns){columnStr += row[column] + " | ";}Console.WriteLine(columnStr);
}dataGridView1.DataSource = dt;

打印每一行的数据,不想用 foreach ,使用 for 循环也是可以的。


for (int i = 0; i < dt.Rows.Count; i++)
{string columnStr = string.Empty;for (int j = 0; j < dt.Columns.Count; j++){columnStr += dt.Rows[i][j] + " | ";}Console.WriteLine(columnStr);
}

运行效果,Winform 和 控制台:

6.判断 DataTable 列中是否存在某个值

使用 DataTable.Select 来查询表格中的数据

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));//添加行
dt.Rows.Add("1号", 17, 155, 220);
dt.Rows.Add("2号", 12, 220, 300);
dt.Rows.Add("3号", 45, 170, 132);//判断 DataTable 列中是否存在某个值
DataRow[] seleRes = dt.Select(string.Format("{0}='{1}'", "姓名", "2号"));
Console.WriteLine("寻找结果:{0}", seleRes.Length > 0);

运行:

将代码作一下更改

DataRow[] seleRes = dt.Select(string.Format("{0}='{1}'", "姓名", "2"));
Console.WriteLine("寻找结果:{0}", seleRes.Length > 0);

运行:

7.设置主键

表的主键必须是唯一的,才能标识表中的记录。 还可以使用由两列或更多列组成的主键的表。 当单个列不能包含足够的唯一值时,将发生这种情况。 例如,两列主键可能包含“OrderNumber”和“ProductID”列。 由于主键可以由多个列组成,因此 PrimaryKey 该属性由对象数组 DataColumn 组成。

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));//添加行
dt.Rows.Add("1号", 17, 155, 220);
dt.Rows.Add("2号", 12, 220, 300);
dt.Rows.Add("3号", 45, 170, 132);//设置主键
DataColumn[] PrimaryKeyColumns = new DataColumn[2];
//添加主键,必须是已经在DataTable里有的列名
PrimaryKeyColumns[0] = dt.Columns["姓名"];
PrimaryKeyColumns[1] = dt.Columns["年龄"];
//配置主键
dt.PrimaryKey = PrimaryKeyColumns;

8.获取 DataRow 所在的行号

一个主键的获取方法

DataTable dt = new DataTable("Datas");
DataColumn dc = new DataColumn();
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = 1;//起始为1
dc.AutoIncrementStep = 1;//步长为1
dc.AllowDBNull = false;//是否允许空值//添加列
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("身高", typeof(float));
dt.Columns.Add("体重", typeof(float));//添加行
dt.Rows.Add("1号", 17, 155, 220);
dt.Rows.Add("2号", 12, 220, 300);
dt.Rows.Add("3号", 45, 170, 132);//设置主键
DataColumn[] PrimaryKeyColumns = new DataColumn[1];
//添加主键,必须是已经在DataTable里有的列名
PrimaryKeyColumns[0] = dt.Columns["姓名"];
//配置主键
dt.PrimaryKey = PrimaryKeyColumns;//获取行号
DataRow dataRow = dt.Rows.Find("3号");
int index = dataRow.Table.Rows.IndexOf(dataRow);
Console.WriteLine("行号:{0}", index);

运行:

如果是两个主键,要这么写

//设置主键
DataColumn[] PrimaryKeyColumns = new DataColumn[2];
//添加主键,必须是已经在DataTable里有的列名
PrimaryKeyColumns[0] = dt.Columns["姓名"];
PrimaryKeyColumns[1] = dt.Columns["年龄"];
//配置主键
dt.PrimaryKey = PrimaryKeyColumns;//获取行号
DataRow dataRow = dt.Rows.Find(new object[] { "3号", 45 });
int index = dataRow.Table.Rows.IndexOf(dataRow);
Console.WriteLine("行号:{0}", index);

运行结果依然是:2

注意,这里的姓名和年龄必须匹配,如果写错了,比如,将 45 改为 46,代码也会报错

9.DataTable 转换为 List<T>

代码


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Reflection;/// <summary>
/// 将DataTable数据源转换成实体类
/// </summary>
public static class ConvertTool
{/// <summary>/// DataTable转换成实体类/// </summary>/// <typeparam name="T"></typeparam>/// <param name="dt"></param>/// <returns></returns>public static List<T> TableToEntity<T>(DataTable dt) where T : class, new(){List<T> list = new List<T>();try{foreach (DataRow row in dt.Rows){T entity = new T();PropertyInfo[] pArray = entity.GetType().GetProperties();foreach (PropertyInfo p in pArray){if (dt.Columns.Contains(p.Name)){if (!p.CanWrite) continue;var value = row[p.Name];if (value != DBNull.Value){Type targetType = p.PropertyType;Type convertType = targetType;if (targetType.IsGenericType && targetType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))){//可空类型NullableConverter nullableConverter = new NullableConverter(targetType);convertType = nullableConverter.UnderlyingType;}if (!string.IsNullOrEmpty(convertType.FullName) && !string.IsNullOrEmpty(value.ToString())){value = Convert.ChangeType(value, convertType);}switch (convertType.FullName){case "System.Decimal":p.SetValue(entity, Convert.ToDecimal(value), null);break;case "System.String":p.SetValue(entity, Convert.ToString(value), null);break;case "System.Int32":p.SetValue(entity, Convert.ToInt32(value), null);break;case "System.Int64":p.SetValue(entity, Convert.ToInt64(value), null);break;case "System.Int16":p.SetValue(entity, Convert.ToInt16(value), null);break;case "System.Double":p.SetValue(entity, Convert.ToDouble(value), null);break;case "System.DateTime":p.SetValue(entity, Convert.ToDateTime(value), null);break;default:p.SetValue(entity, value, null);break;}}}}list.Add(entity);}}catch (Exception ex){Console.WriteLine(ex.Message);}if(list.Count > 0)return list;elsereturn null;}
}

10.将 List<T> 转 DataTable

这里分不转换标题和转换标题,先看看 List<T> 直接转换为 DataTable,如果 T 的实体类字段为英文,那么 DataTable 的列名也将全是英文显示

/// <summary>
/// 将 List 转换成 DataTable (不转换标题)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="data"></param>
/// <returns></returns>
public static DataTable ToDataTable<T>(List<T> data)
{if(data == null || data.Count == 0) return null;PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));DataTable dt = new DataTable();for (int i = 0; i < properties.Count; i++){PropertyDescriptor property = properties[i];dt.Columns.Add(property.Name, property.PropertyType);}object[] values = new object[properties.Count];foreach (T item in data){for (int i = 0; i < values.Length; i++){values[i] = properties[i].GetValue(item);}dt.Rows.Add(values);}return dt;
}

将英文的字段转换为中文列名,这需要做一些转换,我建立了一个自定义特性 UserAttribute,如下

using System;//自定义特性类
[AttributeUsage(AttributeTargets.Property)]
internal class UserAttribute : Attribute
{public string ChineseName { get; set; }public UserAttribute(string chineseName){ChineseName = chineseName;}
}

将要把转换为中文的字段,在特性中添加中文名

internal class UserInfo
{[User("用户名")]public string UserName { get; set; }[User("地址")]public string Address { get; set; }[User("年龄")]public int Age { get; set; }[User("重量")]public int Weight { get; set; }
}

转换方法:

/// <summary>
/// 将 List 转换为 DataTable (转换标题)
/// </summary>
/// <param name="list">数据实体</param>
/// <returns></returns>
public static DataTable ListToDataTable<T>(List<T> list)
{if (list == null || list.Count == 0) return null;//创建一个名为"tableName"的空表DataTable dt = new DataTable("tableName");//key 中文名, value 英文名Dictionary<string, string> dic = new Dictionary<string, string>();//创建传入对象名称的列foreach (var item in list.FirstOrDefault().GetType().GetProperties()){object[] attrs = item.GetCustomAttributes(true);if (attrs.Length > 0 && attrs[0] is UserAttribute){UserAttribute user = attrs[0] as UserAttribute;dt.Columns.Add(user.ChineseName);dic.Add(user.ChineseName, item.Name);}elsedt.Columns.Add(item.Name);}//循环存储foreach (var item in list){//新加行DataRow value = dt.NewRow();//根据DataTable中的值,进行对应的赋值foreach (DataColumn dtColumn in dt.Columns){int i = dt.Columns.IndexOf(dtColumn);string cloumnName = dtColumn.ColumnName;if (dic.ContainsKey(cloumnName)){cloumnName = dic[cloumnName];}//基元元素,直接复制,对象类型等,进行序列化if (value.GetType().IsPrimitive){value[i] = item.GetType().GetProperty(cloumnName).GetValue(item);}else{value[i] = JsonConvert.SerializeObject(item.GetType().GetProperty(cloumnName).GetValue(item));}}dt.Rows.Add(value);}return dt;
}

三、DataGridView 的用法

1.绑定数据

绑定数据在上面的案例中用了多次,就一句,将控件的 DataSource 属性绑定 DataTable 即可。

dataGridView1.DataSource = dt;

这里能绑定的不只是  DataTable 类型,DataSet,DataView,ArrayList,Dictionary,List  都是可以的,这里更推荐使用 List<类> 去绑定数据,可以参考我的另一个帖子,里面会介绍 DataGridView 绑定数据可能出现的问题

C# Winform DataGridView 数据刷新问题_c# datagridview 更新数据-CSDN博客

2.获取绑定的数据源

可以将绑定的数据转换为绑定之前的类型,如下

 DataTable dataTable = (dataGridView1.DataSource as DataTable);

目前测试这样获取的 DataTable 是没有问题的,注意:如果 DataSource 绑定的是 List,那么就 List 进行转换,用什么类型的绑定的,就用什么类型转换,否则转换的结果是 null。

3.获取 / 设置 选中单元格的数据

先给 dataGridView1 控件添加一个事件 CellClick 

代码

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{//当前的行数int selectRowIndex = dataGridView1.CurrentRow.Index;//当前的列数int selectColumnIndex = dataGridView1.CurrentCell.ColumnIndex;DataTable dataTable = (dataGridView1.DataSource as DataTable);int rowLen = dataTable.Rows.Count;if (selectRowIndex >= rowLen) return;Console.WriteLine("当前选中行:{0},选中的列:{1}", selectRowIndex, selectColumnIndex);
}

运行后,点击最后一行,最后一列

控制台输出

由于绑定数据后,会自动添加一行,这里点击空白行,就会超出 DataTable 的行数,不加判断的话就会报错,这里需要注意下。

有了行和列的索引,获取值就比较简单了,直接获取 DataTable 的值就好了

object obj = dataTable.Rows[selectRowIndex][selectColumnIndex];
Console.WriteLine("value:{0}", obj);

设置它的值也是通用的道理。

4.设置单元格的宽高

宽高的自适应

//根据数据内容自动调整列宽
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader;
//根据数据内容自动调整行高
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders; 

根据第二章的例子,效果

系统自动去掉了空白的部分,这看起来特别拥挤,还不如手动设置宽度。

手动设置列宽的写法,这里的0,1,2,3 是列的索引

dataGridView1.Columns[0].Width = 100;
dataGridView1.Columns[1].Width = 100;
dataGridView1.Columns[2].Width = 200;
dataGridView1.Columns[3].Width = 150;

结束

如果这个帖子对你有所帮助,欢迎 关注 + 点赞 + 留言,谢谢!

end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/457662.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoo+Vue构建简洁日志文件查看系统

点击下载《SpringBooVue构建日志文件查看系统&#xff08;源代码&#xff09;》 1. 前言 想必经常做java开发的小伙伴&#xff0c;其大多数服务都是运行在linux系统上的&#xff0c;当遇到一些比较棘手的bug需要处理时&#xff0c;经常要上服务器去捞日志&#xff0c;然后通过…

跟着小德学C++之启动监听

嗨&#xff0c;大家好&#xff0c;我是出生在达纳苏斯的一名德鲁伊&#xff0c;我是要立志成为海贼王&#xff0c;啊不&#xff0c;是立志成为科学家的德鲁伊。最近&#xff0c;我发现我们所处的世界是一个虚拟的世界&#xff0c;并由此开始&#xff0c;我展开了对我们这个世界…

选择大语言模型:2024 年开源 LLM 入门指南

作者&#xff1a;来自 Elastic Aditya Tripathi 如果说人工智能在 2023 年起飞&#xff0c;这绝对是轻描淡写的说法。数千种新的人工智能工具被推出&#xff0c;人工智能功能被添加到现有的应用程序中&#xff0c;好莱坞因对这项技术的担忧而戛然而止。 甚至还有一个人工智能工…

什么是UI设计?

用户界面&#xff08;UI&#xff09;它是人与机器互动的载体&#xff0c;也是用户体验&#xff08;UX&#xff09;一个组成部分。用户界面由视觉设计 (即传达产品的外观和感觉) 和交互设计 (即元素的功能和逻辑组织) 两部分组成。用户界面设计的目标是创建一个用户界面&#xf…

YOLOv8改进 更换轻量级网络结构

一、GhostNet论文 论文地址:1911.11907.pdf (arxiv.org) 二、 GhostNet结构 GhostNet是一种高效的目标检测网络,具有较低的计算复杂度和较高的准确性。该网络采用了轻量级的架构,可以在计算资源有限的设备上运行,并能够快速地实时检测图像中的目标物体。 GhostNet基于Mo…

基于 SpringBoot 和 Vue.js 的权限管理系统部署教程

大家后&#xff0c;我是 jonssonyan 在上一篇文章我介绍了我的新项目——基于 SpringBoot 和 Vue.js 的权限管理系统&#xff0c;本文主要介绍该系统的部署 部署教程 这里使用 Docker 进行部署&#xff0c;Docker 基于容器技术&#xff0c;它可以占用更少的资源&#xff0c;…

Centos7.9安装SQLserver2017数据库

Centos7.9安装SQLserver2017数据库 一、安装前准备 挂载系统盘 安装依赖 yum install libatomic* -y 二、yum方式安装 # 配置 yum 源 wget -O /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/7/mssql-server-2017.repoyum clean all yum…

Windows 版Oracle 数据库(安装)详细过程

首先到官网上去下载oracle64位的安装程序 第一步&#xff1a;将两个datebase文件夹解压到同一目录中。 当下载完成后,它里面是两个文件夹 win64_11gR2_database_1of2, win64_11gR2_database_2of2,我们需要把其中的一个database文件夹整合在一起(复制一个database文件夹到另一…

Flutter学习(八)Flutter_Boost接入

背景 基于安卓的原生项目&#xff0c;进行Flutter的接入&#xff0c;进行混合开发。 参考链接 官方地址&#xff1a;link fullter_boost配置&#xff1a;link git代理配置&#xff1a;link kotlin语法集成&#xff1a;link 混合开发的坑&#xff1a;link 开发环境 as4…

Tauri 的基本使用笔记

文章目录 前言如何将 Tauri 集成到前端项目?进程间通信&#xff08;命令&#xff09;const invoke window.__TAURI__.invoke; 进程间通信&#xff08;事件&#xff09;前端 ⇒ RustRust ⇒ 前端我的疑问 开发时的一些技巧用代码打开前端的开发者工具让 Tauri 不要监听文件Rus…

re:从0开始的CSS学习之路 3. CSS三大特性

0. 写在前面 很多的学习其实并不知道在学什么&#xff0c;学一个新东西学着学着就变成了抄代码&#xff0c;背概念。把看视频学习变成了一个赶进度的任务&#xff0c;到头来只学到了一些皮毛。 文章目录 0. 写在前面1. CSS三大特性——层叠性2. CSS三大特性——优先级3. CSS三…

【OpenVINO™】在 MacOS 上使用 OpenVINO™ C# API 部署 Yolov5 (下篇)

在 MacOS 上使用 OpenVINO™ C# API 部署 Yolov5 &#xff08;下篇&#xff09; 项目介绍 YOLOv5 是革命性的 "单阶段"对象检测模型的第五次迭代&#xff0c;旨在实时提供高速、高精度的结果&#xff0c;是世界上最受欢迎的视觉人工智能模型&#xff0c;代表了Ult…