C# 如何在另一个线程中更新数据源内容时刷新DataGridView显示

C# 如何在另一个线程中更新数据源内容时刷新DataGridView显示,c#,multithreading,winforms,data-binding,datagridview,C#,Multithreading,Winforms,Data Binding,Datagridview,用C语言建立windows窗体应用程序# 在FormMain Form上有一个DataGridViewgrid和一个ComboBoxlist,DataGridView有一个数据绑定到DataTable类型的DataSource\u data,我将SelectedIndexChangedEventHandler设置为ComboBox的SelectedIndexChanged事件。(我使用MVC模式实现,\u数据在模型中) 在处理程序中启动了一个任务来查询数据库并在清除数据源后重新填充数据源,我希望

用C语言建立windows窗体应用程序#

在Form
Main Form
上有一个DataGridView
grid
和一个ComboBox
list
,DataGridView有一个数据绑定到DataTable类型的DataSource
\u data
,我将SelectedIndexChangedEventHandler设置为ComboBox的SelectedIndexChanged事件。(我使用MVC模式实现,
\u数据
在模型中)

在处理程序中启动了一个任务来查询数据库并在清除数据源后重新填充数据源,我希望DataGridView会自动将其数据源的内容更新到UI,但它不会,它只是继续显示原始数据(无)

如何使DataGridView在另一个线程上接收DataSource changed事件并显示新内容?谢谢你的帮助~

表格编号:

class MainForm: Form
{
    private void Initialize()
    {
        _controller = new Controller(this);
        grid.DataSource = _controller.MyModel.Data;
    }

    private void list_SelectedIndexChanged(object sender, EventArgs e)
    {
        _controller.RefreshGridViewData(list.SelectedIndex);
    }
}
控制器的代码:

class Controller
{
    Model _model = new Model();
    public Model MyModel { get { return _model; } }

    public void RefreshGridViewData(int id)
    {
        Task.Factory.StartNew(() =>
        {
            _model.RefreshData(id);
        }
    }
}
型号代码:

class Model
{
    DataTable _data = new DataTable();
    public DataTable Data { get { return _data; } }

    public void RefreshData(int id)
    {
        DataTable res = GetDataFromDB(id);

         _data.Clear();
         if (res != null)
         {                               
            _data.Load(res.CreateDataReader());
            res.Dispose();
         }
    }
}

我认为您需要控制.Invoke()更新DataGridView.Refresh()。

尝试将事件提升到UI线程: