找回密码
 立即注册

QQ登录

只需一步,快速开始

credream

中级会员

110

主题

296

帖子

828

积分

中级会员

积分
828

活字格认证

credream
中级会员   /  发表于:2015-10-9 11:46  /   查看:8536  /  回复:9
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的话,编译的时候还是会被自动删除的。。

9 个回复

倒序浏览
Carl
版主   /  发表于:2015-10-9 13:48:00
沙发
在InitializeComponent方法里不要挂CellEnter事件,在InitializeComponent方法调用完成后再挂这个事件。

核心问题是当MultiRow的CurrentCell从Empty变化到(0,0)的时候,(0,0)Cell会触发CellEnter事件。你只要把这个时机跳过去就好。
愿 Engine 归于沉寂,Timer 停止运动,Message Queue 不再流淌,Data Source 为我掌握
回复 使用道具 举报
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,然后再帮你看看如何解决
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
credream
中级会员   /  发表于:2015-10-9 20:29:00
5#
回复 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
6#
回复 5楼credream的帖子

2楼的Carl版主已经解释过会触发事件的原因,不是因为更改Rowcount导致的事件触发,是因为Multirow默认的当前单元格是null,在初始化的时候会变成第一个单元格,因此才会触发CellEnter事件。(在初始化的时候,即使不设置rowcount,而仅仅有template模板,也会触发该事件)。
该事件的触发时机就是,单元格enter。

所以只要避开这个时机,不要在初始化的时候调用CellEnter事件做监控。
你一直强调没有在初始化的时候调用cellEnter事件,或许我们对这点的理解不一致。就我理解,只有你调用了该事件,才会进入事件做相关逻辑。比如你的如下代码就是在调用该事件:
  1. Form1.vb
  2.     Private Sub GcMultiRow1_CellEnter(sender As Object, e As GrapeCity.Win.MultiRow.CellEventArgs) Handles GcMultiRow1.CellEnter
  3.         Dim a As Integer
  4.         a = 3
  5.     End Sub
复制代码

也许你不是使用代码,而是通过窗体上选择控件,然后在属性里去选择一个事件,这也是在初始化的时候调用一个事件。

另外也针对你的case2做了测试,初始化结束后,Form加载完毕,单纯设置RowCount,不会进入CellEnter事件。

如果依然是理解上的误差,请指出。谢谢。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
dafo
版主   /  发表于:2015-10-10 10:34:00
7#
不要通过设计器挂事件,自己在Form_Loaded事件里挂上这个事件。
回复 使用道具 举报
credream
中级会员   /  发表于:2015-10-10 11:08:00
8#
回复 6楼Alice的帖子

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

对吧?
回复 使用道具 举报
credream
中级会员   /  发表于:2015-10-10 11:09:00
9#
回复 7楼dafo的帖子

恩,谢谢大神
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-10-10 13:22:00
10#
回复 8楼credream的帖子

谢谢反馈。
方法可以。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部