如何在多线程环境下更新datagridview的数据源datatable

问题描述 投票:0回答:1

我有 2 个表格,名称为 Form1 和 Form2。

我在Form1中有一个数据表,在Form2中有一个datagridview。

我在 Form1 中使用

Task.Factory.StartNew
功能更新时遇到问题。

当我向数据表添加新行时,除非滚动它,否则 datagridview 将不会更新。 和 当我清除整个数据表并向数据表添加新行时,datagridview 仍然没有更改,并且当我通过单击其中一列进行排序时会发生错误。

首先,更新多线程环境中的 datagridview 中使用的数据表的正确方法是什么。 第二,更新数据表后如何刷新填充datagridview。

表格1

using System.ComponentModel;
using System.Data;
using System.Diagnostics;

namespace dgvTest
{
    public partial class Form1 : Form
    {
        // DataTable for trade histories
        public static DataTable? TradeHistoryDT = null;

        public Form1()
        {
            InitializeComponent();
            TradeHistoryDT = new DataTable();
            TradeHistoryDT.TableName = "TradeHistory";
            TradeHistoryDT.Columns.Add("Time", typeof(DateTime));
            TradeHistoryDT.Columns.Add("Side", typeof(string));
            TradeHistoryDT.Columns.Add("Ticker", typeof(string));
            TradeHistoryDT.Columns.Add("Price", typeof(int));
            TradeHistoryDT.Columns.Add("Quantity", typeof(int));
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 form = new Form2();
            form.Show();
        }


        public void add_rows_to_tt(int n)
        {
            List<Trade> new_trades = GenerateRandomTrades(n);
            ListToDT(new_trades);


        }

        public void change_whole_data(int n)
        {
            TradeHistoryDT.Clear();
            List<Trade> new_trades = GenerateRandomTrades(n);
            ListToDT(new_trades);
        }

        public void ListToDT(List<Trade> new_trades)
        {
            foreach (Trade t in new_trades)
            {
                TradeHistoryDT.Rows.Add(t.ExecuteTime, t.Side, t.Ticker, t.Price, t.Quantity);
            }

        }

        public static List<Trade> GenerateRandomTrades(int numberOfTrades)
        {

            Random random = new Random();
            List<Trade> trades = new List<Trade>();

            for (int i = 0; i < numberOfTrades; i++)
            {
                Trade trade = new Trade
                {
                    ExecuteTime = DateTime.Now.AddMinutes(-1 * random.Next(1, 100)),
                    Side = random.Next(2) == 0 ? "Buy" : "Sell",
                    Ticker = (TickerList)random.Next(1, Enum.GetValues(typeof(TickerList)).Length),
                    Price = random.Next(9000, 11000),
                    Quantity = random.Next(1, 50)
                };

                trades.Add(trade);
            }

            return trades;
        }

        private void button2_Click(object sender, EventArgs e)
        {

            int n = int.Parse(textBox1.Text);
            Task.Factory.StartNew(() => add_rows_to_tt(n));

        }

        private void button3_Click(object sender, EventArgs e)
        {
            int n = int.Parse(textBox1.Text);
            Task.Factory.StartNew(() => change_whole_data(n));

        }



    }
}

表格2

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

namespace dgvTest
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            dataGridView1.DataSource = Form1.TradeHistoryDT;
        }
    }
}

c# multithreading winforms datatable datagridview
1个回答
0
投票

感谢所有评论。

  1. 我修复了那些让 UI 线程更改数据的代码。
  2. 关于“即发即忘”方法的好评论。

谢谢大家

© www.soinside.com 2019 - 2024. All rights reserved.