一、创建项目
新建一个winform项目,界面如下:
为了能随机的生产用户名,加了一个类 GetNameHelper,这个类的代码是从是网上复制的
接着,给 Form1 添加代码,用来测试增删改查等操作。
二、绑定空的数据源
将一个空的 List 绑定到 dataGridView1,后面再添加数据
效果:
从上面的动图可以看到,在 DataGridView 绑定空的 List 后,给 List 添加数据,包括给 DataGridView 刷新表格,给 List 修改数据,都没有效果,DataGridView 界面没有任何变化。
控制台的输出:
三、绑定有数据的数据源
现在测试第2个问题
控制台的输出:
在添加数据后,在绑定 DataGridView 确实能显示对应的数据,但是在绑定后,如果再次添加其他数据,也会和上节一样,不会再有其他的变化,即使刷新表单也是一样
四、修改绑定的数据源
第四个按钮,可以修改数据源的数据,用第三个按钮进行刷新,DataGridView 控件刷新界面的的方法是 Invalidate ,在上面几节的测试中,都有用过。
在上面的几个测试中,测试了绑定数据源的几种情况,在 List 的长度增加, DataGridView 刷新表格
解决数据源刷新问题也很简单,设置 dataGridView1.DataSource = null; 然后重新绑定就可以了,下面是完整的代码:
测试:
后面把代码改为在 Form1_Load 中进行绑定
private void Form1_Load(object sender, EventArgs e)
{
//设置焦点,不让输入框一打开就聚焦
this.ActiveControl = this.label1;
dataGridView1.DataSource = dataList;
}
然后使用定时器调用 UpdateDataTable 方法来刷新数据,就再也没有这个错误了
private void UpdateDataTable()
{
if (dataGridView1.DataSource != null)
{
if (UserList.Count != dataGridView1.Rows.Count)
{
dataGridView1.DataSource = null;
dataGridView1.DataSource = UserList;
return;
}
dataGridView1.Invalidate();
}
}
但是又出现了一个新的错误,由于绑定了一个空的 List,运行时候点击 dataGridView1 表单,就会报下面的错误
所以,还是用下面的代码
/// <summary>
/// 刷新表格
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
private void UpdateDataTable<T>(List<T> list)
{
if (list.Count == 0)
{
dataGridView1.DataSource = null;
return;
}
if (dataGridView1.DataSource != null)
{
if (dataGridView1.Rows.Count != list.Count)
{
dataGridView1.DataSource = null;
dataGridView1.DataSource = list;
return;
}
dataGridView1.Invalidate();
return;
}
if (dataGridView1.DataSource == null)
dataGridView1.DataSource = list;
}
如果需要调整列的宽度,可以这么写
/// <summary>
/// 刷新表格
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
private void UpdateDataTable<T>(List<T> list)
{
if (list == null || list.Count == 0)
{
dataGridView1.DataSource = null;
return;
}
if (dataGridView1.DataSource != null)
{
if (dataGridView1.Rows.Count != list.Count)
{
dataGridView1.DataSource = null;
dataGridView1.DataSource = list;
DataGridView1Resize();
return;
}
dataGridView1.Invalidate();
return;
}
if (dataGridView1.DataSource == null)
{
dataGridView1.DataSource = list;
DataGridView1Resize();
}
}
/// <summary>
/// 调整 DataGridView1 的表格宽度
/// </summary>
private void DataGridView1Resize()
{
//根据实际情况来写
dataGridView1.Columns[0].Width = 130;
dataGridView1.Columns[1].Width = 80;
dataGridView1.Columns[2].Width = 80;
}