zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    }
    
  • 相关阅读:
    【转】【SEE】基于SSE指令集的程序设计简介
    【转】【Asp.Net】asp.net服务器控件创建
    ControlTemplate in WPF ——ScrollBar
    ControlTemplate in WPF —— Menu
    ControlTemplate in WPF —— Expander
    ControlTemplate in WPF —— TreeView
    ControlTemplate in WPF —— ListBox
    ControlTemplate in WPF —— ComboBox
    ControlTemplate in WPF —— TextBox
    ControlTemplate in WPF —— RadioButton
  • 原文地址:https://www.cnblogs.com/z1r0s/p/14284172.html
Copyright © 2011-2022 走看看