大家有没有遇到这样的问题? My.Application.DoEvents()引起的本帖最后由 wuyazhe 于 2012-08-07 07:42:31
大家有没有遇到这样的问题? My.Application.DoEvents()引起的 本帖最后由 wuyazhe 于 2012-08-07 07:42:31 编辑 在别的帖子发过这个问题,但当时没有研究是什么引起的,经过反复测试,发现可能是 My.Application.DoEvents()引起的,项目启用了XP视觉样式(新建项目默认就是这样),界面上有datagridview控件,HScrollBar控件(多个,放在group容器内),datagridview控件添加多个列,使横向滚动条显示出来,(问题就是点击横向滚动条出现的),放个timer控件,用来轮循处理一些事情(下面代码用的是个延时函数,中间调用了My.Application.DoEvents(),用来相应其他事件),问题出现了,当你点击button按钮使timer控件的Timer1.Enabled = True时,点击datagridview控件的滚动条(向右滚动)或HScrollBar控件,频率快点,就是连续双击,这时候界面就乱了,datagridview控件可能就覆盖其他控件充满窗体了,HScrollBar控件完全乱了,向右滚动的按钮不见了,有些控件也不见了..... 下面是代码,大家可以试一下,看怎么解决这个问题(不启用XP视觉样式,就没问题) '--------------------------------
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Timer1.Enabled = False End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Timer1.Enabled = False DelayTime(200) Timer1.Enabled = True End Sub Public Sub DelayTime(ByVal num As Long) Dim oldTime As DateTime oldTime = DateTime.Now Do My.Application.DoEvents() Loop While DateTime.Now.Ticks - oldTime.Ticks < num * 10000 End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Enabled = True End Sub End Class '--------------------------------
[最优解释] 在datagridview 和 HScrollBar 控件的搭配,你要一般要检测控件的尺寸大小的哦。
显示不然肯定会乱。
不过都不知道你这么做有什么用意。
datagridview 有可以设置滚动条的。
[其他解释] 本来就是这样。
DoEvents的作用就是把当前的消息处理函数作为子程序执行。
因此如果你的程序是
botton1_Click()
{
for (int i = 0; i < 10; i++)
{
...
doevents();
}
}
其实就是
botton1_Click()
{
for (int i = 0; i < 10; i++)
{
...
if (消息队列中有新的单击) button1_Click();
}
}
[其他解释] 该回复于2012-07-14 09:53:01被版主删除
[其他解释] 没人碰到这种情况?
------其他解决方案--------------------
vb.net人气 太不旺了
[其他解释] 这种后台运行的东西,可以试试创建线程来完成
[其他解释] 引用: 在datagridview 和 HScrollBar 控件的搭配,你要一般要检测控件的尺寸大小的哦。 显示不然肯定会乱。 不过都不知道你这么做有什么用意。 datagridview 有可以设置滚动条的。 不是有什么用意,HScrollBar也会出现那样的bug,这可能就是个bug,我上面的代码没什么实际意义,只是为了模拟出我碰到的情况,因为我再用HScrollBar、datagridview控件时,连续点击向右滚动条时,右边的滚动条会变成灰色,不能使用了,界面也乱了。
[其他解释] 大家都没遇到这种情况?
[其他解释] 问题依然没有解决,只能放弃使用XP视觉模式,本来觉得.net 界面挺漂亮的,现在又回到VB6.0一样的界面了
[其他解释] 引用: 本来就是这样。 DoEvents的作用就是把当前的消息处理函数作为子程序执行。 因此如果你的程序是 botton1_Click() { for (int i = 0; i < 10; i++) { ... doevents(); } } 其实就是 botton1_Click() { for (int i = 0; i < 10; i++) …… 那么界面为什么会变乱呢?现在发现datagridview控件和HScrollBar控件会变乱,这种问题怎么解决,难道只能放弃启用XP视觉模式?
[其他解释] 引用: 那么界面为什么会变乱呢?现在发现datagridview控件和HScrollBar控件会变乱,这种问题怎么解决,难道只能放弃启用XP视觉模式? 你应该放弃Application.DoEvents
[其他解释] 引用: 引用: 那么界面为什么会变乱呢?现在发现datagridview控件和HScrollBar控件会变乱,这种问题怎么解决,难道只能放弃启用XP视觉模式? 你应该放弃Application.DoEvents 上面的程序只是我模拟出来的,没实际意义,但是我的程序里牵涉到和串口通讯,所以用到了Application.DoEvents,再说也不能因为界面样式而放弃Application.DoEvents啊
[其他解释] 继续中。。。。。。。。。
[其他解释] 有谁测试过吗?
[其他解释] 不大懂
引用: 引用: 在datagridview 和 HScrollBar 控件的搭配,你要一般要检测控件的尺寸大小的哦。 显示不然肯定会乱。 不过都不知道你这么做有什么用意。 datagridview 有可以设置滚动条的。 不是有什么用意,HScrollBar也会出现那样的bug,这可能就是个bug,我上面的代码没什么实际意义,只是为了模拟出我碰到的情况,因为我再用HScro…… [其他解释] 引用: 有谁测试过吗? 测试下回复功能
[其他解释] 点击是一个逻辑操作,实际被分解为三个动作:
左键按下
click
左键抬起
你某时刻执行了Application.DoEvents(),很有可能这个时间,你将这个组合破坏了,于是抬起消息被别的捕获了,或是有按下,有click却没有抬起导致的错误。这个很常见的问题,比如你某个按钮中,写了个很大循环,循环中调用了DoEvents,你就很明显可以看到,按钮按下了,你拖动窗体时,按钮会弹起,再点一次才能拖动窗体。就是类似的原因了。
其实你大可不必这么做,因为System.Windows.Forms.Timer本身就是基于消息的,你的Timer响应函数执行完,就会去执行消息循环,没有必要再调用了。
[其他解释] http://dl5.csdn.net/fd.php?i=260544790977855&s=c13a30a7a9f2972b19030bc327d872dc
我上传了个测试软件大家可以试试,点击开始测试,然后不停点击hscrollbar控件的向右滚动箭头,看看会出现什么情况,(点击频率,双击的频率)
图片如下:
[其他解释] 引用: 我觉得你这里用System.Threading.Timer更合适。
这个道没用过,是不是多线程?能否给个例子
[其他解释] 我觉得你这里用System.Threading.Timer更合适。
[其他解释] 引用: http://dl5.csdn.net/fd.php?i=260544790977855&s=c13a30a7a9f2972b19030bc327d872dc 我上传了个测试软件大家可以试试,点击开始测试,然后不停点击hscrollbar控件的向右滚动箭头,看看会出现什么情况,(点击频率,双击的频率) 图片如下: 好难解决啊