繁体   English   中英

如何从c#中的另一个线程更新datagridview的数据源

[英]How to update datasource of datagridview from another thread in c#

我有一个与ui线程一起运行的后台程序线程。 现在在backgrounder_doWork方法中,我有一个数据表,我正在从数据库添加信息。 我希望它绑定到ui线程中的datagridview以显示给用户。 因此,当dataTable使用来自数据库的新信息进行更新时,datagridview应自动刷新以添加/减去从后台线程收到的任何新行信息。 我怎样才能做到这一点? 我试过这个:

private delegate void dGValueDelegate();
private void dGVValue()
{
    BindingSource bSource = new BindingSource();
    dtFailures.DataSource = bSource;
    bSource.DataSource = dt;
}

其中dt是类级变量。 在backgrounder_dowork方法内部,在开始时我调用dGVVAlue方法然后在后台信息被添加到后台线程中的数据表中。 然而,datagridview不会显示......

下面的代码应该适合你:

private delegate void SetDGVValueDelegate(BindingList<Something> items);

void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{    
    // Some call to your data access layer to get dt

    SetDGVValue(DataTable dt)
}

private void SetDGVValue(DataTable dt)
{    
    if (dataGridView1.InvokeRequired)    
    {        
        dataGridView1.Invoke(new SetDGVValueDelegate(SetDGVValue), dt);    
    }    
    else    
    {        
        dataGridView1.DataSource = dt;    
    }
}

在你的问题中,你提到使用BindingSource,它没有Invoke方法 - 如果你有一个绑定源,你可以改为在表单上调用:

// On the form
public void SetBindingSourceDataSource(object newDataSource)
{
    if (InvokeRequired)
        Invoke(new Action<object>(SetBindingSourceDataSource), newDataSource);
    else
        this.bindingSource.DataSource = newDataSource;
}

您也可以使用Lamda表达式在一行中执行此操作:

void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{    
    // Some call to your data access layer to get dt

    dataGridView1.Invoke((Action)(() => dataGridView1.DataSource = dt));
}

此外,使用DataGridView.Invoke(Delegate)方法将允许您确保在其所属的线程中对datagridview进行更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM