MultiRow8.0,当走到designer文件中的endinit的时候,自动进入cellenter事件
1.MultiRow8.0,当走到designer文件中的endinit的时候,自动进入cellenter事件调查后发现,当设置MultiRow8.0的属性,allowuserToAddRows为True的时候,走designer文件中的endinit的时候会,自动进入cellenter事件中,但MultiRow4.0不会进入到enter事件中
2.总结发现只要当MultiRow8.0的rowcount发生变化的时候就会自动迁到cellenter中,但MultiRow4.0不会进入到enter事件中
3.如何解决这两者的差异?
除了加FLAG之外,因为在designer文件中加入flag的话,编译的时候还是会被自动删除的。。 在InitializeComponent方法里不要挂CellEnter事件,在InitializeComponent方法调用完成后再挂这个事件。
核心问题是当MultiRow的CurrentCell从Empty变化到(0,0)的时候,(0,0)Cell会触发CellEnter事件。你只要把这个时机跳过去就好。 回复 2楼Carl的帖子
InitializeComponent方法里不要挂CellEnter事件?不挂CellEnter事件是什么意思?代码怎么写,然后如果不是在InitializeComponent中,而是在source中处理逻辑的时候,rowcount发生了变化,导致进入了cellenter事件中,这种情况怎么处理呢? 回复 3楼credream的帖子
你好。
版主的意思是,不要在InitializeComponent方法里调用cellEnter事件去做任何逻辑处理。
谢谢你的描述情况,请提供一个demo,让我们看看是什么具体的case,然后再帮你看看如何解决 回复 4楼Alice的帖子
你好,我们没有在InitializeComponent中做任何调用cellEnter的处理,因为InitializeComponent是designer文件中的,但MultiRow8.0的本身,当设置allowuserToAddRows为True时,执行到designer文件中的endinit的时候会,自动进入cellenter事件中,并且当改变rowcount的值的时候也会自动进入cellenter事件,我们猜测,只要是发生行变化,就会自动进入cellenter事件:
我们现在在做程序的升级,MultiRow4.0的Enter事件,升级后,变成了cellEnter事件,但cellEnter,在MultiRow发生行变化的时候老是自动跳入cellenter事件中,但是MultiRow4.0的.MaxMRows 发生变化的时候就不会进入Enter事件中,我们想解决这个问题
CASE1:
Form1.Designer.vb
Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container()
。。。。
CType(Me.GcMultiRow1, System.ComponentModel.ISupportInitialize).EndInit()//走到这句话的时候会自动跳入cellenter事件中
Me.ResumeLayout(False)
End Sub
CASE2:
Form1.vb
Me.GcMultiRow1.RowCount = 3//给RowCount赋值,使得RowCount变化的时候,会自动跳入cellenter事件中
Form1.vb
Private Sub GcMultiRow1_CellEnter(sender As Object, e As GrapeCity.Win.MultiRow.CellEventArgs) Handles GcMultiRow1.CellEnter
Dim a As Integer
a = 3
End Sub 回复 5楼credream的帖子
2楼的Carl版主已经解释过会触发事件的原因,不是因为更改Rowcount导致的事件触发,是因为Multirow默认的当前单元格是null,在初始化的时候会变成第一个单元格,因此才会触发CellEnter事件。(在初始化的时候,即使不设置rowcount,而仅仅有template模板,也会触发该事件)。
该事件的触发时机就是,单元格enter。
所以只要避开这个时机,不要在初始化的时候调用CellEnter事件做监控。
你一直强调没有在初始化的时候调用cellEnter事件,或许我们对这点的理解不一致。就我理解,只有你调用了该事件,才会进入事件做相关逻辑。比如你的如下代码就是在调用该事件:
Form1.vb
Private Sub GcMultiRow1_CellEnter(sender As Object, e As GrapeCity.Win.MultiRow.CellEventArgs) Handles GcMultiRow1.CellEnter
Dim a As Integer
a = 3
End Sub
也许你不是使用代码,而是通过窗体上选择控件,然后在属性里去选择一个事件,这也是在初始化的时候调用一个事件。
另外也针对你的case2做了测试,初始化结束后,Form加载完毕,单纯设置RowCount,不会进入CellEnter事件。
如果依然是理解上的误差,请指出。谢谢。 不要通过设计器挂事件,自己在Form_Loaded事件里挂上这个事件。 回复 6楼Alice的帖子
楼主说的已经明白,感激提醒,可以在需要的时机进行代码中调用对吧?
像下面这样:
AddHandler Me.btnSearch.MouseDown, AddressOf CGMM330_MouseDown
如果出现rowcount变化导致,当前单元格的变化的时候,可以移除这个事件然后在设置后再添加:
RemoveHandler Me.mlsSpecial.MouseUp, AddressOf CGCM310A_MouseUp
对吧? 回复 7楼dafo的帖子
恩,谢谢大神 回复 8楼credream的帖子
谢谢反馈。
方法可以。
页:
[1]