.net – 暂停重绘Windows窗体
发布时间:2020-12-14 02:02:17 所属栏目:Windows 来源:网络整理
导读:我有一个窗体.它包含几个datagridviews.在某些时候,用户可以按下更新datagridviews的按钮.当他们这样做时,他们通常可以坐下来观看datagridview重绘本身,一次一行.我希望控件在它“完成”之前不要画画,也就是说,我想要一种方法来告诉控件 Control.SuspendRedr
我有一个窗体.它包含几个datagridviews.在某些时候,用户可以按下更新datagridviews的按钮.当他们这样做时,他们通常可以坐下来观看datagridview重绘本身,一次一行.我希望控件在它“完成”之前不要画画,也就是说,我想要一种方法来告诉控件
Control.SuspendRedraw() this.doStuff() this.doOtherStuff() this.doSomeReallyCoolStuff() Control.ResumeRedaw() 我已经看过SuspendLayout / ResumeLayout函数,但它们什么都不做(它们似乎与调整大小/移动控件更相关,而不仅仅是编辑它们的数据值?) 解决方法
您可以尝试以下几种方法:
首先,尝试将DataGridView的DoubleBuffer属性设置为true.这是实际DataGridView实例上的属性,而不是Form.它是受保护的属性,因此您必须对网格进行子类化以进行设置. class CustomDataGridView: DataGridView { public CustomDataGridView() { DoubleBuffered = true; } } 我已经看到很多小抽奖更新在一些视频卡上使用DataGridView需要一段时间,这可以通过在发送显示之前对它们进行批处理来解决您的问题. 您可以尝试的另一件事是Win32消息WM_SETREDRAW // ... this would be defined in some reasonable location ... [DllImport("user32.dll",CharSet = CharSet.Auto,SetLastError = false)] static extern IntPtr SendMessage(HandleRef hWnd,Int32 Msg,IntPtr wParam,IntPtr lParam); static void EnableRepaint(HandleRef handle,bool enable) { const int WM_SETREDRAW = 0x000B; SendMessage(handle,WM_SETREDRAW,new IntPtr(enable ? 1 : 0),IntPtr.Zero); } 在你的代码的其他地方,你有 HandleRef gh = new HandleRef(this.Grid,this.Grid.Handle); EnableRepaint(gh,false); try { this.doStuff(); this.doOtherStuff(); this.doSomeReallyCoolStuff(); } finally { EnableRepaint(gh,true); this.Grid.Invalidate(); // we need at least one repaint to happen... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 适用于Skype的Android Api?
- 获取当前线程ID在Windows 8与C#
- monodevelop – Windows的Gtk#2.12.22在哪里?
- 在Windows中运行后台进程命令行的工具?
- windows-server-2012-r2 – 启用NLA后RDP错误“不支持请求的
- windows – 处理地址空间与虚拟内存
- 通过console.log()打印window对象的属性、方法、事件
- Meteor的最基本(“todos”)示例在我的Windows 7上无法正常工
- 如何处理Windows 7的125%或150%放大率(Delphi)
- hp-proliant – HP DL320e Gen8,3TB驱动器,Windows Server