在Thread之后,DataGridView ScrollBars无法正常工作

时间:2015-07-03 15:07:09

标签: c# multithreading winforms scroll datagridview

我将dataTable设置为datagridview的数据源。我在一个新线程上执行此操作(我不希望在加载数据时我的UI被阻止)。 我的困境是:线程完成后滚动条不起作用。我在加载数据之前尝试设置Scrollbars.None,之后尝试设置Scrollbars.Both。还尝试使用Refresh。但只是帮助我显示滚动条,这些仍然没有工作。

如果我在我的主体中使用相同的代码,那么它就可以完美地运行。

那我怎么做才能让它发挥作用?

我的代码:

postcodes = {
    '123abc': {'postcode': '123abc', 'street': 'some street name', 'town': 'a town', 'city': 'a city'},
    ...
}

3 个答案:

答案 0 :(得分:4)

好的,我终于明白了。我在我的线程中使用了MethodInvoker。它允许我在UI线程上运行并更新控件:

private void LoadData()
{
    CheckForIllegalCrossThreadCalls = false;
    this.dgv.Columns.Clear();
    this.dgv.DataSource = MyDataTable;

    this.Invoke((MethodInvoker)delegate
    {
        dgv.ScrollBars = ScrollBars.Both; // runs on UI thread
    });

}

答案 1 :(得分:0)

我认为DataGridView的UI和数据源绑定不在同一个线程中。因此它的UI无法识别数据源已绑定。 你能尝试一下:通过将ScrollBars设置为Both来实现DataBindingComplete的委托吗?

例如:

private void dataGridView_DataBindingComplete(object sender,
    DataGridViewBindingCompleteEventArgs e)
{
    this.dgv.ScrollBars = ScrollBars.Both;
}

该文件: https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.databindingcomplete(v=vs.110).aspx

答案 2 :(得分:0)

您需要在UI线程中执行UI操作才能生效。

//UI Thread
this.Invoke((MethodInvoker)delegate
{
    //DataGridview Refreshment
    dataGridView.Enabled = true;
    dataGridView.ScrollBars = ScrollBars.Both;
});