【问题标题】:DataGridView ScrollBars are not working after ThreadDataGridView ScrollBars 在 Thread 之后不起作用
【发布时间】:2015-09-21 11:23:17
【问题描述】:

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

如果我在主体中使用相同的代码,线程它可以完美运行。

那么我该怎么做才能让它工作呢?

我的代码:

private void PressKey(object sender, KeyPressEventArgs e)
    {
        var process = new Thread(this.LoadData);
        process.Start();
    }

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

【问题讨论】:

  • 发布您的代码以获得答案

标签: c# multithreading winforms scroll datagridview


【解决方案1】:

好的,我终于明白了。我在我的线程中使用了 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
    });

}

【讨论】:

  • 感谢您的帮助!在我今天的情况下,我还必须将ScrollBars 设置为None,然后在我对更改DataSource 感到满意之后,我会将ScrollBars 设置回我想要的值(Vertical)。把这个留在这里给其他人看。
【解决方案2】:

我认为 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

【讨论】:

  • 同理。显示了滚动条,但它们不起作用。当我尝试滚动 dgv 时,它们保持静止
  • 我已尝试通过您的代码创建应用程序。滚动条似乎可见但已禁用。我认为滚动条是在“进程”线程中创建的,它不适用于主线程中的 dgv。我现在没有任何解决方案,如果有我会回复。
  • 你说得对,滚动条是在第二个线程上创建的。但我已经解决了这个问题,终于可以工作了。我使用 MethodInvoker 委托在主线程上设置 ScrollBars.Both。非常感谢您的帮助
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2016-02-03
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    相关资源
    最近更新 更多