1. 程式人生 > >CASE----使用Timer控制元件對DataGridView控制元件中的資料進行更新

CASE----使用Timer控制元件對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();
        }

解決控制元件資料重新整理問題。