我有 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;
}
}
}
感谢所有评论。
谢谢大家