CASE----使用Timer控件对DataGridView控件中的数据进行更新

目录

问题引入

解决思想

程序要求

技术分析

设计界面

实现过程详述

1、界面设计(只显示主要控件的设计)

2、测试类设计

3、泛性集合

4、添加按钮Click事件

5、DataGridView控件数据源与集合绑定方法设计

6、Timer控件的Tick事件

遇到的问题及解决方法

1、数据项自动绑定失败

2、DataGridView控件的数据值刷新一次


问题引入

        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();
        }
    }
}
原文地址:https://www.cnblogs.com/z1r0s/p/14284172.html