线程内,动态刷新DataGridView

业务:计时刷新DataGridView

Task.Factory.StartNew(() =>
                {
                    System.Timers.Timer timer = new System.Timers.Timer();
                    timer.Enabled = true;
                    timer.Interval = config.dowDataRate;                    // 执行间隔时间 
                    timer.Start();
                    timer.Elapsed += new System.Timers.ElapsedEventHandler(MachingDownInfo.DownMachingFile);
                });

开了一个线程,来获取DataGridView的数据。我的思路本来是直接在这个计时方法中绑定当前窗体的DataGridView控件的值。
这种方法并不可行,虽然没报错。但是值还是绑定不上。
此问题的原因,自己总结了一下:DataGridView控件不能在类中绑定数据。

最后反复测试,找到了解决方案。

Task.Factory.StartNew(() =>
                {
                    System.Timers.Timer timer = new System.Timers.Timer();
                    timer.Enabled = true;
                    timer.Interval = config.dowDataRate;                    // 执行间隔时间 
                    timer.Start();
                    timer.Elapsed += new System.Timers.ElapsedEventHandler(MachingDownInfo.DownMachingFile);

                    // 动态刷新列表数据
                    System.Timers.Timer timer1 = new System.Timers.Timer();
                    timer1.Enabled = true;
                    timer1.Interval = (config.dowDataRate / 2);             // 执行间隔时间 
                    timer1.Start();
                    timer1.Elapsed += new System.Timers.ElapsedEventHandler(BindGridListTimer);
                });

声明了两个计时器,第二个是刷新列表的。绑定列表的时间间隔设置的为取列表数据时间间隔的一半。

private void BindGridListTimer(object source, ElapsedEventArgs e)
        {
            try
            {
                SetGridData();
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.Message, "错误信息", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }

        // 声明委托
        private delegate void SetGridDelegate();
        /// <summary>
        /// 委托将参数与方法传递给控件所在的线程,并由控件所在的线程执行
        /// </summary>
        public void SetGridData()
        {
            if (this.InvokeRequired)
                this.Invoke(new SetGridDelegate(SetGridData));
            else
                BindGrid();
        }

        static DataTable dtCsvGrid = new DataTable();
        /// <summary>
        /// CSV列表,在执行**MachingDownInfo.DownMachingFile**方法时会给此变量赋值。![在这里插入图片描述]
        /// </summary>
        public DataTable _dtCsvGrid
        {
            get { return dtCsvGrid; }
            set { dtCsvGrid = value; }
        }

        /// <summary>
        /// 绑定设备保养信息grid列表数据
        /// </summary>
        /// <returns></returns>
        public void BindGrid()
        {
            dataGridView1.DataSource = dtCsvGrid;
        }


以上经过测试,可行! 虽然有点笨拙。但是我看到列表刷新的那一刻,超级激动啊!!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要添加数据并刷新DataGridView,您需要执行以下步骤: 1. 将数据添加到数据源。 2. 调用DataGridView的Refresh方法,以便它可以重新绘制自己并显示新数据。 3. 如果您使用的是绑定的数据源,您还需要调用BindingSource的ResetBindings方法,以便它可以通知DataGridView数据源已更改。 以下是一个示例代码片段,演示如何添加数据并刷新DataGridView: ``` // 假设您有一个名为dataGridView1的DataGridView控件和一个名为dataTable的DataTable对象 // 添加新行到dataTable DataRow newRow = dataTable.NewRow(); newRow["Column1"] = "Value1"; newRow["Column2"] = "Value2"; dataTable.Rows.Add(newRow); // 刷新DataGridView dataGridView1.Refresh(); // 如果您使用的是绑定的数据源,还需要调用BindingSource的ResetBindings方法 bindingSource.ResetBindings(false); ``` 请注意,如果您正在使用虚拟模式(Virtual Mode)来填充DataGridView,您需要在添加数据后调用DataGridView的Invalidate方法,以便它可以重新绘制自己。 ### 回答2: DataGridView是一个常用的数据展示控件,我们在使用时需要随时向其添加新的数据,而且这些数据有可能是从数据库获取的,有可能是用户自己输入的,所以我们需要刷新DataGridView来实现数据的动态展示。 刷新DataGridView有多种方式,常见的有以下几种: 1. 直接使用DataGridView.DataSource属性重新绑定数据源。 这种方式比较简单,只需要将DataGridView的DataSource属性重新指定为数据源即可。例如: dataGridView1.DataSource = dataTable1; 其dataTable1是一个DataTable对象,可以从数据库获取或者通过用户输入等方式创建。 但是重新绑定数据源的方式会导致一些问题,比如如果用户在DataGridView自己进行了排序、过滤等操作,这些操作会被清除掉,不太适合需要保留用户自定义操作的情况。 2. 使用DataGridView.Rows.Add方法向其添加新的行。 这种方式比较直接,只需要在需要添加数据的时候,调用DataGridView.Rows.Add方法即可。例如: dataGridView1.Rows.Add("1", "张三", "男", "20"); 这样就向DataGridView添加了一行数据,第一列是1,第二列是“张三”,依次类推。当然,我们可以根据需要自定义添加多列数据。 这种方式适合需要动态添加数据,但是如果数据量比较大,可能会导致界面卡顿。 3. 使用DataGridView.DataSource的BindingList属性。 这种方式比较灵活,可以动态地向BindingList添加数据,然后再将BindingList赋DataGridView.DataSource。例如: BindingList<Person> peopleList = new BindingList<Person>(); peopleList.Add(new Person() { Id = "1", Name = "张三", Gender = "男", Age = "20" }); dataGridView1.DataSource = peopleList; 这样就先创建了一个BindingList,然后往里面添加了一个Person对象,最后将BindingList赋DataGridView,就完成了数据的动态展示。 这种方式比较灵活,可以方便地对数据进行排序、过滤等操作,也可以针对DataGridView单元格进行自定义格式化等操作。但是需要注意的是,如果数据量比较大,可能会导致内存占用过多,需要在使用时做好内存管理。 总的来说,根据不同的需求,可以选择不同的方式来刷新DataGridView。在使用过程,需要根据数据量、用户需求等多方面因素进行考虑,以选择最合适的方式来实现数据的动态展示。 ### 回答3: DataGridView是Windows Forms应用程序常用的控件,用于显示和编辑表格数据。在DataGridView,数据呈现在一系列行和列。需要添加新的数据,或修改现有的数据,然后通过刷新DataGridView来显示这些更改。 添加数据 添加数据至DataGridView时,可以使用多个方法,其最简单的方法是使用DataGridView.Rows.Add()方法。该方法允许您添加单个或多个行到DataGridView。下面是如何使用DataGridView.Rows.Add()方法添加一行数据到DataGridView的示例: ```C# private void btnAdd_Click(object sender, EventArgs e) { DataGridViewRow newRow = new DataGridViewRow(); newRow.CreateCells(dataGridView1); newRow.Cells[0].Value = "1"; newRow.Cells[1].Value = "John"; newRow.Cells[2].Value = "Doe"; dataGridView1.Rows.Add(newRow); } ``` 刷新DataGridView刷新DataGridView以显示添加的新数据,可以使用DataGridView.Refresh()方法。它们可以通过在添加数据后调用此方法来使DataGridView在UI更新。类似地,如果您更改了现有数据,则可以使用该方法使更改立即反映在DataGridView。 还有一种刷新DataGridView的方法是使用DataGridView.Update()方法。它在刷新DataGridView时与DataGridView.Refresh()类似,但更加高效。当您修改或添加大量数据时,它与DataGridView.Refresh()方法相比提供了更好的性能。下面是使用DataGridView.Update()方法刷新DataGridView的示例: ```C# private void btnAdd_Click(object sender, EventArgs e) { DataGridViewRow newRow = new DataGridViewRow(); newRow.CreateCells(dataGridView1); newRow.Cells[0].Value = "1"; newRow.Cells[1].Value = "John"; newRow.Cells[2].Value = "Doe"; dataGridView1.Rows.Add(newRow); dataGridView1.Update(); } ``` 总结 添加新数据后,为了确保DataGridView立即显示更改,应该刷新DataGridViewDataGridView.Refresh()方法是最简单的方法,但由于性能原因,可以使用DataGridView.Update()方法。DataGridView.Update()方法更适合处理大量数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值