• 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();
            }
        }
    }
    
  • 相关阅读:
    IO模型详解
    Java中的CAS实现原理
    深入理解幂等性
    区块链基本原理入门
    通俗易懂讲解IO模型
    java高级特性(4)--枚举
    static、final和finalize详解
    锁(3)-- DB锁
    浅析项目中的并发
    分布式(1)-- 分布式锁
  • 原文地址:https://www.cnblogs.com/z1r0s/p/14284172.html
Copyright © 2020-2023  润新知