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

81 篇文章 3 订阅
13 篇文章 0 订阅

我们测试使用内存数据表来绑定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;
        }
    }
}

程序运行如图:

 

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斯内科

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值