找回密码
 立即注册

QQ登录

只需一步,快速开始

sxyweiren

中级会员

73

主题

366

帖子

755

积分

中级会员

积分
755

活字格认证微信认证勋章

sxyweiren
中级会员   /  发表于:2015-12-28 14:42  /   查看:12121  /  回复:11
今天对于EditingControl的SelectedIndexChanged进行监控,结果发现了下面的问题。
现在怀疑属于MR8.0的Bug。请确认。

1,Mr的EditMode设定为EditOnEnter或者在CellEnter事件里面添加逻辑BeginEdit
2,Mr一共两列,第一列设定为ComboBox,DropDownStyle设定为DropDown,Items里面的值为 11,22,33,44,55,66
3,每一行的第一列的值都设置为不同的值。比如第一行为11,第二行为22,第三行为33
4,点击ComboBox单元格,发现第二列的值发生了错乱。

代码参考


    Private Sub mlsREJI_CellEditedFormattedValueChanged(sender As Object, e As GrapeCity.Win.MultiRow.CellEditedFormattedValueChangedEventArgs) Handles mlsREJI.CellEditedFormattedValueChanged
        Debug.Print(e.Reason)
        If e.Reason = "SelectedIndexChanged" Then
            mlsREJI(e.RowIndex, e.CellIndex + 1).Value = mlsREJI(e.RowIndex, e.CellIndex).EditedFormattedValue
        End If
    End Sub

    Private Sub GcMultiRow1_EditingControlShowing(sender As Object, e As GrapeCity.Win.MultiRow.EditingControlShowingEventArgs) Handles mlsREJI.EditingControlShowing
        If TypeOf e.Control Is GrapeCity.Win.MultiRow.InputMan.GcComboBoxEditingControl Then
            Dim combo As GrapeCity.Win.MultiRow.InputMan.GcComboBoxEditingControl = e.Control
            RemoveHandler combo.SelectedIndexChanged, AddressOf combo_SelectedIndexChanged
            AddHandler combo.SelectedIndexChanged, AddressOf combo_SelectedIndexChanged

        End If
    End Sub

    Private Sub combo_SelectedIndexChanged(sender As Object, e As EventArgs)
        If Convert.ToString(mlsREJI.CurrentCell.Value) <> Convert.ToString(mlsREJI.CurrentCell.EditedFormattedValue) Then
            With mlsREJI.CurrentCell
                Call mlsREJI_CellEditedFormattedValueChanged(mlsREJI, New GrapeCity.Win.MultiRow.CellEditedFormattedValueChangedEventArgs(.RowIndex, .CellIndex, .Name, "SelectedIndexChanged"))
            End With
        End If
    End Sub

11 个回复

倒序浏览
sxyweiren
中级会员   /  发表于:2015-12-28 14:45:00
沙发
这里我用的ComboBox是GrapeCity.Win.MultiRow.InputMan.GcComboBox
回复 使用道具 举报
robert
金牌服务用户   /  发表于:2015-12-28 16:05:00
板凳
不知道你说的错乱是什么意思,我按你的代码思路做了个程序。效果是当我点击第一列的Cell时,第二列的值会立即变成第一列的值。这个是你说的错乱效果吗?
回复 使用道具 举报
sxyweiren
中级会员   /  发表于:2015-12-28 16:36:00
地板
回复 3楼robert的帖子

然后依次点击第二行的第一列,第三行的第一列,第一行的第一列
会发现第二行的第二列的值是第一行的第一列的值。
第三行的第二列的值是第二行的第一列的值。
第一行的第二列的值是第三行的第一列的值。
回复 使用道具 举报
sxyweiren
中级会员   /  发表于:2015-12-28 16:50:00
5#
回复 3楼robert的帖子

另外,如果第一行第一列的单元格选中22,然后选中33(初期单元格的值不是33)
按下回车键的时候值会自动变成光标初次进入时的第一行第一列的值。
回复 使用道具 举报
robert
金牌服务用户   /  发表于:2015-12-29 12:08:00
6#
是否可以上传一个简单的工程来重现你的问题呢?
回复 使用道具 举报
sxyweiren
中级会员   /  发表于:2015-12-29 13:51:00
7#
回复 6楼robert的帖子

由于我这边不能在上班期间上传下载文件,所以做了一个动态模板的Sample。
首先创建一个Form1,在Form1上拖一个Mr,Mr的Name定义为mlsREJI。

操作方法:首先把第一列的值从上到下修改成当前值+11(小键盘直接输入,不是通过下拉菜单选择),比如11变成22,然后通过鼠标点击选择下一行。
               都改完了,会发现第一列和第二列的值不相等。
              然后从上到下点击第一列的单元格,发现光标进入单元格的同时触发了SelectedIndexChanged事件,导致前一列和后一列的值相等了。

  1. Public Class Form1

  2.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  3.         Dim tmplate As New GrapeCity.Win.MultiRow.Template
  4.         tmplate.Clear()
  5.         tmplate.Width = mlsREJI.Width
  6.         tmplate.Row.Width = tmplate.Width
  7.         tmplate.Row.Height = 21
  8.         tmplate.Row.Cells.Add(New GrapeCity.Win.MultiRow.InputMan.GcComboBoxCell)
  9.         tmplate.Row.Cells.Add(New GrapeCity.Win.MultiRow.LabelCell)
  10.         tmplate.Row.Cells(1).Location = New Point(tmplate.Row.Cells(0).Size.Width, 0)
  11.         CType(tmplate.Row.Cells(0), GrapeCity.Win.MultiRow.InputMan.GcComboBoxCell).DropDownStyle = GrapeCity.Win.MultiRow.MultiRowComboBoxStyle.DropDown
  12.         With CType(tmplate.Row.Cells(0), GrapeCity.Win.MultiRow.InputMan.GcComboBoxCell).Items
  13.             .Add(&quot;11&quot;)
  14.             .Add(&quot;22&quot;)
  15.             .Add(&quot;33&quot;)
  16.             .Add(&quot;44&quot;)
  17.             .Add(&quot;55&quot;)
  18.             .Add(&quot;66&quot;)
  19.             .Add(&quot;77&quot;)
  20.             .Add(&quot;88&quot;)
  21.             .Add(&quot;99&quot;)
  22.             .Add(&quot;00&quot;)
  23.         End With
  24.         CType(tmplate.Row.Cells(0), GrapeCity.Win.MultiRow.InputMan.GcComboBoxCell).AutoSelect = False
  25.         mlsREJI.Template = tmplate
  26.         mlsREJI.AllowUserToAddRows = False
  27.         mlsREJI.AllowUserToResize = False
  28.         mlsREJI.AllowUserToDeleteRows = False
  29.         mlsREJI.AllowUserToAutoFitColumns = False
  30.         mlsREJI.RowCount = 10
  31.         mlsREJI.EditMode = GrapeCity.Win.MultiRow.EditMode.EditOnEnter

  32.         For inti As Integer = 0 To 6
  33.             mlsREJI.Item(inti, 0).Value = CStr(inti + 1) &amp; CStr(inti + 1)
  34.         Next
  35.     End Sub


  36.     Private Sub mlsREJI_CellEditedFormattedValueChanged(sender As Object, e As GrapeCity.Win.MultiRow.CellEditedFormattedValueChangedEventArgs) Handles mlsREJI.CellEditedFormattedValueChanged
  37.         Debug.Print(e.Reason)
  38.         If e.Reason = &quot;SelectedIndexChanged&quot; Then
  39.             mlsREJI(e.RowIndex, e.CellIndex + 1).Value = mlsREJI(e.RowIndex, e.CellIndex).EditedFormattedValue
  40.         End If
  41.     End Sub

  42.     Private Sub GcMultiRow1_EditingControlShowing(sender As Object, e As GrapeCity.Win.MultiRow.EditingControlShowingEventArgs) Handles mlsREJI.EditingControlShowing
  43.         If TypeOf e.Control Is GrapeCity.Win.MultiRow.InputMan.GcComboBoxEditingControl Then
  44.             Dim combo As GrapeCity.Win.MultiRow.InputMan.GcComboBoxEditingControl = e.Control
  45.             RemoveHandler combo.SelectedIndexChanged, AddressOf combo_SelectedIndexChanged
  46.             AddHandler combo.SelectedIndexChanged, AddressOf combo_SelectedIndexChanged
  47.         End If
  48.     End Sub
  49.     Private Sub combo_SelectedIndexChanged(sender As Object, e As EventArgs)
  50.         With mlsREJI.CurrentCell
  51.             Call mlsREJI_CellEditedFormattedValueChanged(mlsREJI, New GrapeCity.Win.MultiRow.CellEditedFormattedValueChangedEventArgs(.RowIndex, .CellIndex, .Name, &quot;SelectedIndexChanged&quot;))
  52.         End With
  53.     End Sub
  54. End Class
复制代码
回复 使用道具 举报
robert
金牌服务用户   /  发表于:2015-12-29 16:07:00
8#
我用你的代码做了个工程,感觉重现你说的问题了。
你试试如下代码是否可以解决问题
  1.     Private Sub mlsREJI_CellValidated(sender As Object, e As CellEventArgs) Handles mlsREJI.CellValidated
  2.         If TypeOf mlsREJI.EditingControl Is GrapeCity.Win.MultiRow.InputMan.GcComboBoxEditingControl Then
  3.             Dim combo As GrapeCity.Win.MultiRow.InputMan.GcComboBoxEditingControl = mlsREJI.EditingControl
  4.             RemoveHandler combo.SelectedIndexChanged, AddressOf combo_SelectedIndexChanged
  5.         End If
  6.     End Sub
复制代码
回复 使用道具 举报
sxyweiren
中级会员   /  发表于:2016-1-9 11:08:00
9#
回复 8楼robert的帖子

稍微可以了。但是因为EditMode是EditOnEnter所以,在执行代码EndEdit等操作的时候还是会触发EditingControl的SelectedIndex事件。。

实在是不好搞了。我这边用了全局变量拦截,另外加了个Timer,每隔200毫秒把全局变量初期化(False)。
EditingControlShowing的时候把全局变量设置为不可触发EditingControl的SelectedIndex事件的值(True)
回复 使用道具 举报
robert
金牌服务用户   /  发表于:2016-1-11 10:26:00
10#
》 稍微可以了。但是因为EditMode是EditOnEnter所以,在执行代码EndEdit等操作的时候还是会触发EditingControl的SelectedIndex事件。
其实,你遇到的最主要原因就是EditingControlShowing的时候要挂EditingControl的事件,但是没有好的时机去移除事件。
针对你说的这个问题,也可以处理为在EndEdit的时候先移除事件,再处理逻辑。如果EndEdit的时机还是太晚的话也可以移动到CellValidating事件里去摘事件。
Timer方法可以解决,但是经常会引入一些非预期的问题,且不好调试。建议慎用。

评分

参与人数 1金币 +999 收起 理由
Alice + 999 奖励金币

查看全部评分

回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部