credream 发表于 2015-10-9 11:46:00

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的话,编译的时候还是会被自动删除的。。

Carl 发表于 2015-10-9 13:48:00

在InitializeComponent方法里不要挂CellEnter事件,在InitializeComponent方法调用完成后再挂这个事件。

核心问题是当MultiRow的CurrentCell从Empty变化到(0,0)的时候,(0,0)Cell会触发CellEnter事件。你只要把这个时机跳过去就好。

credream 发表于 2015-10-9 15:57:00

回复 2楼Carl的帖子

InitializeComponent方法里不要挂CellEnter事件?不挂CellEnter事件是什么意思?代码怎么写,然后如果不是在InitializeComponent中,而是在source中处理逻辑的时候,rowcount发生了变化,导致进入了cellenter事件中,这种情况怎么处理呢?

Alice 发表于 2015-10-9 18:15:00

回复 3楼credream的帖子

你好。
版主的意思是,不要在InitializeComponent方法里调用cellEnter事件去做任何逻辑处理。
谢谢你的描述情况,请提供一个demo,让我们看看是什么具体的case,然后再帮你看看如何解决

credream 发表于 2015-10-9 20:29:00

回复 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

Alice 发表于 2015-10-10 09:17:00

回复 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事件。

如果依然是理解上的误差,请指出。谢谢。

dafo 发表于 2015-10-10 10:34:00

不要通过设计器挂事件,自己在Form_Loaded事件里挂上这个事件。

credream 发表于 2015-10-10 11:08:00

回复 6楼Alice的帖子

楼主说的已经明白,感激提醒,可以在需要的时机进行代码中调用对吧?
像下面这样:
AddHandler Me.btnSearch.MouseDown, AddressOf CGMM330_MouseDown
如果出现rowcount变化导致,当前单元格的变化的时候,可以移除这个事件然后在设置后再添加:
RemoveHandler Me.mlsSpecial.MouseUp, AddressOf CGCM310A_MouseUp

对吧?

credream 发表于 2015-10-10 11:09:00

回复 7楼dafo的帖子

恩,谢谢大神

Alice 发表于 2015-10-10 13:22:00

回复 8楼credream的帖子

谢谢反馈。
方法可以。
页: [1]
查看完整版本: MultiRow8.0,当走到designer文件中的endinit的时候,自动进入cellenter事件