【问题标题】:Datagridview retains waitcursor when updated from thread从线程更新时,Datagridview 保留等待光标
【发布时间】:2010-06-09 19:00:23
【问题描述】:

我的 Windows 窗体应用程序中有一个 DataGridView 控件。 我正在使用后台线程向网格中添加行。当进程开始时,我将表单的光标更改为 Waitcursor 并在结束时返回默认值。这适用于表单,但不适用于网格。当表单的光标改回默认值时,网格的光标不会改变,尽管表单其余部分的光标会改变。

这与我从后台线程更新网格这一事实有关吗? (光标直接从 UI 线程改变)。

编辑:后台进程引发一个事件,处理程序检查网格的 InvokeRequired 属性并决定是否需要从主线程再次“调用”该方法。因此,实际上实际的 UI 更新发生在适当的线程中。我不确定这是否意味着我“使用后台线程”。 :|

【问题讨论】:

  • 您不应该从其他线程更改 UI,在您的情况下是网格。这应该只在主线程中完成。

标签: vb.net datagridview multithreading


【解决方案1】:

我在对数据网格进行单线程更新时遇到了一些问题,在我将 waitcursor 设置为 true 后,数据网格没有重置为正常光标。 我去之后就做了什么

this.UseWaitCursor = false;

我加了

DatagridviewFoo.Cursor = this.Cursor;

也许这对你来说只是同样的问题

【讨论】:

    【解决方案2】:

    我也遇到过这个问题。很难追查原因,更不用说解决方案了。

    只有当我在 DGV 控件上有一个对话框并且鼠标单击一个按钮以关闭该框时,才会发生此问题,这样当该框关闭时,鼠标位于(可调整大小的)列边框上。如果光标最终位于单元格上,则不会出现问题。如果我不得不猜测,我会说一旦对话框关闭,网格就会看到一个列调整大小事件,但没有正确处理。

    使用Cursor.Current = Cursors.Default 解决了我的问题(无需显式重置控件的光标)。但也许要注意 Application.UseWaitCursor = False 即使在显式控制光标重置的情况下也不起作用。

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,但发布的解决方案都不适合我。我不是通过单击可移动列分隔符上方的按钮引起的。它只是在打开和关闭对话框后随机发生的。我很确定这归结为时间问题,因为 .Net/Windows 在设置游标并实际使它们生效时存在问题。为了克服这个问题,我们用于显示和隐藏等待光标调用的库 - ack! - 应用程序.DoEvents。我在 OnCursorChanged 中设置了一个断点,并看到光标有时实际上是在稍后调用 Application.DoEvents 时设置的(用于在等待文件系统释放文件的写锁定时保持 UI 响应)。所以我想有时在设置等待光标的调用完全生效之前,默认光标会重新打开。无论如何,我的蛮力方法是调用

      Cursor = Cursors.Default;
      

      在我对 OnCellEnter 的覆盖中(在关闭对话框后刷新网格后总是发生这种情况)。我对此并不感到特别自豪,但它似乎奏效了。

      【讨论】:

        猜你喜欢
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-16
        • 1970-01-01
        • 1970-01-01
        • 2018-04-08
        • 1970-01-01
        相关资源
        最近更新 更多