目录
问题引入
DataGridView控件可以将集合中的数据值以表的形式显示,由于DataGridView是静态控件,从而存在当集合中的数据值发生变化时,DataGridView控件不会随着集合中数据的变化而变化。
解决思想
Timer控件是一个线程控件,在一定时间段内执行指定的操作,DataGridView控件可以显示集合中的数据,可以使用Timer控件对DataGridView控件中显示的数据值进行动态的更新。
程序要求
- 程序始终维护一个List集合变量
- List集合中的变量可以在窗中的DataGridView控件中显示
- 使用Timer控件达到1S对控件中显示的数据进行更新
技术分析
- 泛性集合的使用
- DataGridView控件的使用
- Timer控件的使用及线程技术
设计界面
实现过程详述
1、界面设计(只显示主要控件的设计)
2、测试类设计
namespace RefreshingDataByTimer
{
public class UserInfo
{
private int iD;
private string userName;
private string userPwd;
public int ID
{
get
{
return iD;
}
set
{
iD = value;
}
}
public string UserName
{
get
{
return userName;
}
set
{
userName = value;
}
}
public string UserPwd
{
get
{
return userPwd;
}
set
{
userPwd = value;
}
}
}
}
3、泛性集合
List<UserInfo> list;
public Form1()
{
InitializeComponent();
list = new List<UserInfo>();
InitFrm();
}
4、添加按钮Click事件
private void btnAdd_Click(object sender, EventArgs e)
{
if(txtUserName.Text != "")
{
if(txtUserPwd.Text != "")
{
UserInfo userInfo = new RefreshingDataByTimer.UserInfo();
userInfo.ID = list.Count;
userInfo.UserName = txtUserName.Text;
userInfo.UserPwd = txtUserPwd.Text;
list.Add(userInfo);
MessageBox.Show("添加成功");
dgvShow.DataSource = list;
}
}
}
5、DataGridView控件数据源与集合绑定方法设计
private void InitFrm()
{
dgvShow.DataSource = null;
dgvShow.DataSource = list;
}
6、Timer控件的Tick事件
private void timer1_Tick(object sender, EventArgs e)
{
InitFrm();
//dgvShow.Refresh();
}
遇到的问题及解决方法
1、数据项自动绑定失败
描述:使用public修饰的UserInfo中的字段,使用DataGridView控件的自动填充列的功能时,控件中未显示任何数据值。
public int ID;
public string UserName;
public string UserPwd;
原因:DataGridView控件的列名与类中属性名及其属性的排列顺序一一对应,若在Model类中没有将字段封装未属性,则不能使用DataGridView控件的自动列名填充功能。
修改方案:
private int iD;
private string userName;
private string userPwd;
public int ID
{
get
{
return iD;
}
set
{
iD = value;
}
}
public string UserName
{
get
{
return userName;
}
set
{
userName = value;
}
}
public string UserPwd
{
get
{
return userPwd;
}
set
{
userPwd = value;
}
}
结果显示:
2、DataGridView控件的数据值刷新一次
使用Refresh()方法进行刷新,但是显示的界面没有更新
查阅资料:
参考博主的解决方案对程序做如下调整:
private void timer1_Tick(object sender, EventArgs e)
{
//InitFrm();
dgvShow.Invoke(new Action(() => dgvShow.Refresh()));
}
(很不幸还是失败了~_~泪)
另辟蹊径,手动写刷新方法
private void InitFrm()
{
dgvShow.DataSource = null;
dgvShow.DataSource = list;
}
private void timer1_Tick(object sender, EventArgs e)
{
InitFrm();
}
解决控件数据刷新问题。
注:Form1完整代码
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace RefreshingDataByTimer
{
public partial class Form1 : Form
{
List<UserInfo> list;
public Form1()
{
InitializeComponent();
list = new List<UserInfo>();
InitFrm();
}
private void InitFrm()
{
dgvShow.DataSource = null;
dgvShow.DataSource = list;
}
private void btnAdd_Click(object sender, EventArgs e)
{
if(txtUserName.Text != "")
{
if(txtUserPwd.Text != "")
{
UserInfo userInfo = new RefreshingDataByTimer.UserInfo();
userInfo.ID = list.Count;
userInfo.UserName = txtUserName.Text;
userInfo.UserPwd = txtUserPwd.Text;
list.Add(userInfo);
MessageBox.Show("添加成功");
dgvShow.DataSource = list;
}
}
}
private void timer1_Tick(object sender, EventArgs e)
{
InitFrm();
}
}
}