DataGridView使用数据源绑定,每隔几秒钟就刷新数据

我们测试使用内存数据表来绑定DataGridView,每隔5秒钟就刷新一次数据绑定。

新建winforms应用程序BIndDataDemo,将默认的Form1重命名为FormBindDataGridDemo。

窗体FormBindDataGridDemo设计如图:

 窗体FormBindDataGridDemo主要程序如下

(忽略设计器自动生成的代码):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BIndDataDemo
{
    public partial class FormBindDataGridDemo : Form
    {
        /// <summary>
        /// 重新绑定数据事件
        /// </summary>
        public event Action<DataTable> EventRebindData;
        /// <summary>
        /// 线程是否已经运行
        /// </summary>
        bool isRun = false;
        public FormBindDataGridDemo()
        {
            InitializeComponent();

            dgvData.AutoGenerateColumns = false;
            dgvcId.DataPropertyName = "Id";
            dgvcEnglishName.DataPropertyName = "EnglishName";
            dgvcChineseName.DataPropertyName = "ChineseName";
            dgvcDBNum.DataPropertyName = "DBNum";
            dgvcAddress.DataPropertyName = "Address";
            dgvcDataType.DataPropertyName = "DataType";
            dgvcByteCount.DataPropertyName = "ByteCount";
            dgvcValue.DataPropertyName = "Value";
        }

        private void FormBindDataGridDemo_Load(object sender, EventArgs e)
        {
            EventRebindData += FormBindDataGridDemo_EventRebindData;
            EventRebindData.Invoke(GenerateDataTable(2021));
        }

        private void FormBindDataGridDemo_EventRebindData(DataTable dt)
        {
            this.BeginInvoke(new Action(() => 
            {
                dgvData.DataSource = dt;
                dgvData.FirstDisplayedScrollingRowIndex = dgvData.Rows.Count - 1;
            }));            
        }

        /// <summary>
        /// 生成数据表
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        private DataTable GenerateDataTable(int count) 
        {
            DataTable dataTable = new DataTable("DataDemo");
            dataTable.Columns.Add("Id", typeof(int));
            dataTable.Columns.Add("EnglishName", typeof(string));
            dataTable.Columns.Add("ChineseName", typeof(string));
            dataTable.Columns.Add("DBNum", typeof(string));
            dataTable.Columns.Add("Address", typeof(int));
            dataTable.Columns.Add("DataType", typeof(string));
            dataTable.Columns.Add("ByteCount", typeof(int));
            dataTable.Columns.Add("Value", typeof(string));

            dataTable.Rows.Add(1, "DataItem1", "数据项1", "DB200", 0, "Int", 2, "32767");
            dataTable.Rows.Add(2, "DataItem2", "数据项2", "DB200", 2, "Real", 4, "-723.425");
            dataTable.Rows.Add(3, "Barcode", "条码", "DB200", 6, "String", 12, "ABCD");
            double coefficient = (count % 2 == 0 ? 0.1 : 0.2);//系数
            for (int i = 0; i < count; i++)
            {
                dataTable.Rows.Add(i + 4, $"DataItem{i + 4}", $"数据项{i + 4}", "DB200", 18 + 4 * i, "Real", 4, (i + 4) * 2 + coefficient * i);
            }
            return dataTable;
        }


        private void btnWrite_Click(object sender, EventArgs e)
        {
            int id = Convert.ToInt32(numId.Value);
            if (id < 1 || id > dgvData.Rows.Count) 
            {
                MessageBox.Show($"指定的编号【{id}】不在范围内", "错误");
                return;
            }
            dgvData.Rows[id - 1].Cells["dgvcValue"].Value = txtValue.Text;
        }

        /// <summary>
        /// 重新绑定按钮事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnRebind_Click(object sender, EventArgs e)
        {
            btnRebind.Enabled = false;
            isRun = true;
            Random random = new Random(Guid.NewGuid().GetHashCode());
            Task task = Task.Factory.StartNew(() => 
            {
                //每隔一秒钟重新绑定
                while (isRun)
                {
                    EventRebindData.Invoke(GenerateDataTable(random.Next(1000, 8000)));
                    Thread.Sleep(5000);
                }
            });
            Task.WaitAll(new Task[] { task }, 8000);
        }

        /// <summary>
        /// 停止绑定事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnStop_Click(object sender, EventArgs e)
        {
            btnRebind.Enabled = true;
            isRun = false;
        }

        private void FormBindDataGridDemo_FormClosing(object sender, FormClosingEventArgs e)
        {
            //解除事件绑定
            EventRebindData -= FormBindDataGridDemo_EventRebindData;
            isRun = false;
        }
    }
}

程序运行如图:

猜你喜欢

转载自blog.csdn.net/ylq1045/article/details/120992126