找回密码
 立即注册

QQ登录

只需一步,快速开始

sfchina1977

注册会员

4

主题

22

帖子

124

积分

注册会员

积分
124

活字格认证

最新发帖
sfchina1977
注册会员   /  发表于:2011-8-6 11:19  /   查看:8929  /  回复:4
原来程序在VSNET2003下下使用Spread WInForm 1.0开发的,现在升级到VSNET2008,Spread也升级为5.0。在Grapecity上找到的产品介绍上说5.0是向下兼容的。但是我们现在发现一个很严重的问题,那就是相同操作下触发的事件和1.0的不一致。

特别是EditModePermanent设为True后,出现了很多奇怪的现象。
下面是测试程序。
窗体上有一个Spread和一个按钮。
Spread中B列是设置为Locked=True的。
操作如下
VSNET2003,Spread WinForm 1.0

1、焦点在A列单元格上,鼠标点击B列的单元格,  焦点还是在A列单元格上。
触发事件:
2011/08/06 11:54:37 766-[FpSpread1_GotFocus]-Start

2、焦点在A列单元格上,鼠标点击C列的单元格,  焦点落在C列单元格上。
触发事件:
2011/08/06 11:54:37 766-[FpSpread1_LeaveCell]-Start
2011/08/06 11:54:37 790-[FpSpread1_EnterCell]-Start

VSENT2008,Spread WinForm 5.0

1、焦点在A列单元格上,鼠标点击B列的单元格,  焦点落在按钮上。
触发事件:
2011/08/06 11:56:09 031-[FpSpread1_Leave]-Start
2011/08/06 11:56:09 031-[FpSpread1_Validating]-Start

2、焦点在A列单元格上,鼠标点击C列的单元格,  焦点落在C列单元格上。
触发事件:
2011/08/06 11:56:52 968-[FpSpread1_LeaveCell]-Start
2011/08/06 11:56:52 968-[FpSpread1_GotFocus]-Start
2011/08/06 11:56:52 968-[FpSpread1_Leave]-Start
2011/08/06 11:56:52 968-[FpSpread1_Validating]-Start
2011/08/06 11:56:52 984-[FpSpread1_Enter]-Start
2011/08/06 11:56:52 984-[FpSpread1_GotFocus]-Start
2011/08/06 11:56:52 984-[FpSpread1_EnterCell]-Start

4 个回复

倒序浏览
sfchina1977
注册会员   /  发表于:2011-8-6 11:19:00
沙发

回复 1# sfchina1977 的帖子

测试代码如下
Public Class Form1

    Inherits System.Windows.Forms.Form



#Region " Windows フォーム デザイナで生成されたコード "



    Public Sub New()

        MyBase.New()



        ' この呼び出しは Windows フォーム デザイナで必要です。

        InitializeComponent()



        ' InitializeComponent() 呼び出しの後に初期化を追加します。



    End Sub



    ' Form は、コンポーネント一覧に後処理を実行するために dispose をオーバーライドします。

    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

        If disposing Then

            If Not (components Is Nothing) Then

                components.Dispose()

            End If

        End If

        MyBase.Dispose(disposing)

    End Sub



    ' Windows フォーム デザイナで必要です。

    Private components As System.ComponentModel.IContainer



    ' メモ : 以下のプロシージャは、Windows フォームデザイナで必要です。

    'Windows フォーム デザイナを使って変更してください。

    ' コード エディタを使って変更しないでください。

    Friend WithEvents FpSpread1 As FarPoint.Win.Spread.FpSpread

    Friend WithEvents FpSpread1_Sheet1 As FarPoint.Win.Spread.SheetView

    Friend WithEvents Button1 As System.Windows.Forms.Button

    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

        Me.FpSpread1 = New FarPoint.Win.Spread.FpSpread

        Me.FpSpread1_Sheet1 = New FarPoint.Win.Spread.SheetView

        Me.Button1 = New System.Windows.Forms.Button

        CType(Me.FpSpread1, System.ComponentModel.ISupportInitialize).BeginInit()

        CType(Me.FpSpread1_Sheet1, System.ComponentModel.ISupportInitialize).BeginInit()

        Me.SuspendLayout()

        '

        'FpSpread1

        '

        Me.FpSpread1.Location = New System.Drawing.Point(32, 8)

        Me.FpSpread1.Name = "FpSpread1"

        Me.FpSpread1.Sheets.AddRange(New FarPoint.Win.Spread.SheetView() {Me.FpSpread1_Sheet1})

        Me.FpSpread1.Size = New System.Drawing.Size(480, 104)

        Me.FpSpread1.TabIndex = 0

        '

        'FpSpread1_Sheet1

        '

        Me.FpSpread1_Sheet1.Reset()

        'Formulas and custom names must be loaded with R1C1 reference style

        Me.FpSpread1_Sheet1.ReferenceStyle = FarPoint.Win.Spread.Model.ReferenceStyle.R1C1

        Me.FpSpread1_Sheet1.Columns.Get(1).BackColor = System.Drawing.Color.FromArgb(CType(224, Byte), CType(224, Byte), CType(224, Byte))

        Me.FpSpread1_Sheet1.Columns.Get(1).Locked = True

        Me.FpSpread1_Sheet1.RowHeader.Columns.Default.Resizable = False

        Me.FpSpread1_Sheet1.SheetName = "Sheet1"

        Me.FpSpread1_Sheet1.ReferenceStyle = FarPoint.Win.Spread.Model.ReferenceStyle.A1

        '

        'Button1

        '

        Me.Button1.Location = New System.Drawing.Point(72, 128)

        Me.Button1.Name = "Button1"

        Me.Button1.TabIndex = 1

        Me.Button1.Text = "Button1"

        '

        'Form1

        '

        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)

        Me.ClientSize = New System.Drawing.Size(616, 262)

        Me.Controls.Add(Me.Button1)

        Me.Controls.Add(Me.FpSpread1)

        Me.Name = "Form1"

        Me.Text = "Form1"

        CType(Me.FpSpread1, System.ComponentModel.ISupportInitialize).EndInit()

        CType(Me.FpSpread1_Sheet1, System.ComponentModel.ISupportInitialize).EndInit()

        Me.ResumeLayout(False)



    End Sub



#End Region





    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        _DebugWriteLog(System.Reflection.MethodBase.GetCurrentMethod.Name, "Start")

        Me.FpSpread1.EditModePermanent = True

    End Sub



    Private Sub FpSpread1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles FpSpread1.Enter

        _DebugWriteLog(System.Reflection.MethodBase.GetCurrentMethod.Name, "Start")



    End Sub



    Private Sub FpSpread1_EnterCell(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.EnterCellEventArgs) Handles FpSpread1.EnterCell

        _DebugWriteLog(System.Reflection.MethodBase.GetCurrentMethod.Name, "Start")



    End Sub



    Private Sub FpSpread1_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles FpSpread1.GotFocus

        _DebugWriteLog(System.Reflection.MethodBase.GetCurrentMethod.Name, "Start")

    End Sub



    Private Sub FpSpread1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles FpSpread1.Leave

        _DebugWriteLog(System.Reflection.MethodBase.GetCurrentMethod.Name, "Start")



    End Sub



    Private Sub FpSpread1_LeaveCell(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.LeaveCellEventArgs) Handles FpSpread1.LeaveCell

        _DebugWriteLog(System.Reflection.MethodBase.GetCurrentMethod.Name, "Start")



    End Sub



    Private Sub FpSpread1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles FpSpread1.Validating

        _DebugWriteLog(System.Reflection.MethodBase.GetCurrentMethod.Name, "Start")



    End Sub



    Private Sub _DebugWriteLog(ByVal methodName As String, ByVal logContent As String)

        Dim logTime As String = Now.ToString("yyyy/MM/dd HH:mm:ss fff")

        Dim logMessage As String = String.Format("{0}-[{1}]-{2}", logTime, methodName, logContent)

       System.Console.WriteLine(logMessage)

    End Sub

End Class
回复 使用道具 举报
sfchina1977
注册会员   /  发表于:2011-8-6 11:23:00
板凳

回复 1# sfchina1977 的帖子

这个事件触发机制让我们很受伤,而且也没有道理。
因为很多的验证是在Validating去做的。
点击Locked=True的列焦点直接就出Spread了。

请教我们该怎么去修改代码,让程序返回到原来的事件处理流程?
通过Spread的什么设置可以实现,或者是外部代码实现?
回复 使用道具 举报
sfchina1977
注册会员   /  发表于:2011-8-6 11:25:00
地板

回复 1# sfchina1977 的帖子

而且严重的是当点击C列焦点依旧在Spread内部时,Leave和Validating事件就会被触发。这个绝对没有道理呀!
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2011-8-15 10:17:00
5#
谢谢提供以上信息,请参考以下回复:http://gcdn.grapecity.com/showtopic-1988.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部