C#winform重绘机制

utakeiteasy 2016-09-26 11:53:54
1、比如有窗体A 点击button,在click中修改lable的值 ,click执行完毕后界面更新了label的值,这是局部重绘还是整体重绘,为什么发生了重绘,原理是啥

2、对于datagrideview控件,如果某几列数据发生变化,单独处理这几列 与 处理完数据重新绑定哪个更换,为什么?
(这2种操作,前者是对datagrideview进行了整体重绘,还是只是重绘了修改了的部分,后者额?)


求大神解惑,谢谢。
...全文
1282 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jvouge 2016-11-16
  • 打赏
  • 举报
回复


只是自绘了DATAGRIDVIEW 的一个单元格, 怎么 颜色像漏了, 跑到表格外面去了。 ??
花开花折 2016-09-26
  • 打赏
  • 举报
回复
引用 楼主 utakeiteasy 的回复:
1、比如有窗体A 点击button,在click中修改lable的值 ,click执行完毕后界面更新了label的值,这是局部重绘还是整体重绘,为什么发生了重绘,原理是啥 2、对于datagrideview控件,如果某几列数据发生变化,单独处理这几列 与 处理完数据重新绑定哪个更换,为什么? (这2种操作,前者是对datagrideview进行了整体重绘,还是只是重绘了修改了的部分,后者额?) 求大神解惑,谢谢。
1:局部 建议看下重绘机制 2:应该也是部分,不太确定。
john_QQ:2335298917 2016-09-26
  • 打赏
  • 举报
回复
如果你有mfc编程经验,就会知道界面的重绘是由控件的编程者决定的。而且重绘的最小矩形也是由编程者决定的。当需要重绘时,为了效率,常常需要确定需要更新的最小矩形。
crystal_lz 2016-09-26
  • 打赏
  • 举报
回复
一个控件 应该什么时候绘制 主要有两个 一个是 系统来确定 这个控件需要绘制 比如 最小化后在最大化 那么此时 系统会发出WM_PAINT 消息来告知控件 你需要重绘了 另一个就是 人为的调用this.Invalidate()或者this.Invalidate(Rectangle)来自己触发一次重绘 对于第一种 那是系统自身的一种行为 不管你是什么控件系统自带的还是自己写的 对于一些操作必然是要重绘界面的 比如刚才我说的最小化后 在最大化 控件隐藏后 在显示 得到焦点 失去焦点 之类的 这种是必然要重绘的 对于第二种 比如我要自己写一个datagridview 那么系统压根就不会知道这个是什么控件 对于系统而言 他只能决定我刚才说的第一种情况来触发控件的绘制 但是我现在像datagrid里面添加了数据 我需要把数据绘制出来 假设我控件提供了Add(方法) 当我调用add时候系统不会知道需要绘制控件 所以我需要自己在Add() 里面添加(this.Invalidate()) 来手动触发一个WM_PAINT消息 而WM_PAINT消息被触发的时候 会执行OnPaint函数 然后在OnPaint中 自己把数据绘制到界面上去 而我需要调用this.Invalidate()或者this.Invalidate(Rectangle) 由我自己来决定
utakeiteasy 2016-09-26
  • 打赏
  • 举报
回复
引用 3 楼 crystal_lz 的回复:
局部还是 全部 这和机智没有半毛钱的关系 完全取决于写代码的人 看他是想全部重绘还是局部重绘 抛开label 这种系统自带的控件不说 假设现在我自己继承Control写一个控件 数据更新的时候 刷新界面 而刷新的代码都是你自己写的 那你说 你是全部刷新还是局部刷新?。。 全部刷新还是局部刷新 由写代码的人自己衡量关系 全部刷新方便但是需要整个控件全部绘制 而局部刷新则需要你自己多写一些代码来确定你需要重绘的区域 然后只绘制指定区域
怎么会没有关系,可能是我问的不太对。label就是系统自带的控件,我就是想知道对于系统控件,我没有去写绘制代码,但是为什么click事件处理完毕后,界面会发生重绘?是系统判断了界面有发生变化主动重绘了,还是click执行完,封装好的系统代码执行了该控件的重绘方法? datagrideview也是系统控件,它的数据发生变化后又是如何触发重绘的呢? 我是这样猜测的:当数据发生变化后,无论我重新给该控件绑定数据还是修改对应行列的数值,实际上修改的是该控件缓存的数据,当重绘时,都是根据缓存的数据整个重绘datagrideview控件。 求大神解惑!
crystal_lz 2016-09-26
  • 打赏
  • 举报
回复
局部还是 全部 这和机智没有半毛钱的关系 完全取决于写代码的人 看他是想全部重绘还是局部重绘 抛开label 这种系统自带的控件不说 假设现在我自己继承Control写一个控件 数据更新的时候 刷新界面 而刷新的代码都是你自己写的 那你说 你是全部刷新还是局部刷新?。。 全部刷新还是局部刷新 由写代码的人自己衡量关系 全部刷新方便但是需要整个控件全部绘制 而局部刷新则需要你自己多写一些代码来确定你需要重绘的区域 然后只绘制指定区域
utakeiteasy 2016-09-26
  • 打赏
  • 举报
回复
up up 求大神解惑

111,058

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧