Datagridview在从线程更新时保留等待光标

5
我在Windows Forms应用程序中使用了DataGridView控件。我正在使用后台线程向网格添加行。当进程开始时,我将表单的光标更改为Waitcursor,当进程结束时,将光标更改回默认值。这对于表单很好用,但不适用于网格。当表单的光标改回默认值时,网格的光标不会改变,尽管在表单的其余部分上光标会改变。
这是否与我从后台线程更新网格有关?(光标直接从UI线程更改)。
编辑:后台进程引发事件,处理程序检查网格的InvokeRequired属性,并决定是否需要再次从主线程“调用”该方法。因此,实际的UI更新是从适当的线程进行的。我不确定这是否意味着我正在“使用后台线程”。 :|

你不应该从其他线程更改UI,例如网格。这只能从主线程中完成。 - Adrian Fâciu
3个回答

8
我曾经遇到单线程更新数据表格的问题,即在将等待光标设置为真后,数据表格没有重置回正常光标。 我的解决方法是,在我执行以下代码之后立即进行重置:

this.UseWaitCursor = false;

我添加了

DatagridviewFoo.Cursor = this.Cursor;

也许你正在遇到同样的问题。

3
我也遇到了这个问题。要追踪原因,更不用说解决方案,都很困难。
只有当我在DGV控件上放置一个对话框,并且鼠标点击一个按钮以关闭该框时,这个问题才会发生,这样当框关闭时,鼠标正好在一个(可调整大小的)列边界上。如果光标停留在单元格上,则不会出现问题。如果我必须猜测,我会说网格在对话框关闭时立即看到列调整大小事件,但未被正确处理。
使用Cursor.Current = Cursors.Default解决了我的问题(无需显式重置控件的光标)。但是请注意,即使显式地重置了控件光标,Application.UseWaitCursor = False也无法工作。

1

我遇到了类似的问题,但是已经发布的解决方案都没有对我起作用。我的问题不是由于单击可移动列分隔符上面的按钮引起的。它只是在打开和关闭对话框后随机发生。我相信这是由于时间问题,因为.Net/Windows在设置光标并实际生效时存在问题。为了尝试克服这个问题,我们使用的库来显示和隐藏等待光标调用 - 哎呀! - Application.DoEvents。我在OnCursorChanged中设置了断点,并看到光标有时会在稍后调用Application.DoEvents(用于在等待文件系统释放对文件的写锁定时保持UI响应)时实际设置。所以我猜有时在完全生效之前,等待光标的设置调用被默认光标覆盖了。无论如何,我的蛮力方法是调用

Cursor = Cursors.Default;

在我的 OnCellEnter 重写中(它总是在对话框关闭后刷新网格后发生),我对此并不特别自豪,但它似乎能够正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接