C# C语言中的实时更新#
因此,我有一个需要实时更新的数据网格视图,用于管理软件。我试图在单独的线程上更新控件,但它引发了一个异常:C# C语言中的实时更新#,c#,multithreading,datagridview,C#,Multithreading,Datagridview,因此,我有一个需要实时更新的数据网格视图,用于管理软件。我试图在单独的线程上更新控件,但它引发了一个异常: Cross-thread operation not valid: Control 'dataGridView1' accessed from a thread other than the thread it was created on. 代码如下: public void atualiza() { for (int i = 0; ; i++)
Cross-thread operation not valid: Control 'dataGridView1' accessed from a thread other than the thread it was created on.
代码如下:
public void atualiza()
{
for (int i = 0; ; i++)
{
i--;
tabela();
System.Threading.Thread.Sleep(90000);
}
}
private void mainUser_Load(object sender, EventArgs e)
{
atualizaTabela t = new atualizaTabela(atualiza);
t.BeginInvoke(null, null);
}
“Tabela”是实际更新数据网格视图的方法:
public void tabela()
{
string comando = "SELECT * FROM Job";
OracleDataAdapter da;
OracleCommand comm;
DataSet ds;
OracleConnection Conn = new OracleConnection(dbstring);
comm = new OracleCommand(comando, Conn);
da = new OracleDataAdapter(comm);
ds = new DataSet();
da.Fill(ds, "Job");
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "Job";
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
dataGridView1.Columns[0].HeaderText = "Id";
dataGridView1.Columns[1].HeaderText = "Produto";
dataGridView1.Columns[2].HeaderText = "Cliente";
dataGridView1.Columns[3].HeaderText = "Data de Pedido";
dataGridView1.Columns[4].HeaderText = "Previsão de Entrega";
dataGridView1.Columns[5].HeaderText = "Preço";
dataGridView1.Columns[6].HeaderText = "Tamanho";
dataGridView1.Columns[7].HeaderText = "Quantidade";
dataGridView1.Columns[8].HeaderText = "Comentário";
}
“Atalizatabela”是一个代表。当我尝试将datagridview绑定到数据源时引发异常:
(dataGridView1.datasource=ds)
由于异常状态,您无法从非UI线程访问UI元素
我建议使用后台工作人员
。你可以
以下是您需要完成的基本概述:
- 这似乎是
,因此将WinForms
放到BackgroundWorker
表单上
- 将
属性设置为WorkerReportsProgress
True
- 订阅
和DoWork
事件ProgressChanged
- 从数据库中获取数据,在
事件中,该事件位于单独的线程中DoWork
- 通过调用
将数据传递给ReportProgress
事件ProgressChanged
- 使用发生在UI线程上的
事件中的数据更新网格,这样就不会出现“跨线程操作”异常ProgressChanged
dataGridView1.Invoke(new Action(() =>
{
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "Job";
...
}));
};
谢谢你,好心的先生!这对我帮助很大:)