从线程更新时,Datagridview保留等待标记

时间:2010-06-09 19:00:23

标签: vb.net datagridview multithreading

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

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

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

3 个答案:

答案 0 :(得分:7)

我在对datagrids进行单线程更新时遇到了一些问题,在我将waitcursor设置为true之后,datagrid没有重置为正常游标。 我做的就是我去了之后

this.UseWaitCursor = false;

我添加了

DatagridviewFoo.Cursor = this.Cursor;

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

Cursor = Cursors.Default;

在我的OnCellEnter覆盖中(在关闭对话框后刷新网格后总会发生)。我对此并不特别自豪,但似乎有效。