找回密码
 立即注册

QQ登录

只需一步,快速开始

darkelf
论坛元老   /  发表于:2013-7-30 09:41  /   查看:11816  /  回复:10
Spread3到Spread7的迁移过程中,在同步两个表的显示时遇到问题。

同一个Form中的Sheet1和Sheet2两个表同步滚动时,没有问题。问题出在Sheet1指定TopRow或者LeftCol时,Sheet2不能够同步移动。
搜索相关资料后发现,旧版本的TopRow和LeftCol在数值改变时,触发TopLeftCol事件。

请问如何在TopRow和LeftCol的属性中增加事件呢?我是Vb新手,也是第一次接触Spread,请不吝赐教。

下面是接口的相关部分代码。

Public Property LeftCol() As Long
        Get
                If MyBase.ActiveSheet IsNot Nothing Then
                        Return GetViewportLeftColumn(0) + 1
                Else
                        Return Nothing
                End If
        End Get
        Set(ByVal value As Long)
                If MyBase.ActiveSheet IsNot Nothing Then
                        SetViewportLeftColumn(0, value - 1)
                End If
        End Set
End Property

Public Property TopRow() As Integer
        Get
                If MyBase.ActiveSheet IsNot Nothing Then
                        Return GetViewportTopRow(0) + 1
                Else
                        Return Nothing
                End If
        End Get
        Set(ByVal value As Integer)
                If MyBase.ActiveSheet IsNot Nothing Then
                        SetViewportTopRow(0, value - 1)
                        '
                End If
        End Set
End Property

Public Event TopLeftChange(ByVal sender As Object, ByVal e As _DSpreadEvents_TopLeftChangeEvent)

Private Sub MyBase_TopChange(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.TopChangeEventArgs) Handles Me.TopChange
        Dim eventArgs As New _DSpreadEvents_TopLeftChangeEvent
        eventArgs.NewTop = e.NewTop
        eventArgs.OldTop = e.OldTop
        eventArgs.NewLeft = Me.LeftCol
        RaiseEvent TopLeftChange(sender, eventArgs)
End Sub

Private Sub MyBase_LeftChange(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.LeftChangeEventArgs) Handles Me.LeftChange
        Dim eventArgs As New _DSpreadEvents_TopLeftChangeEvent
        eventArgs.NewLeft = e.NewLeft
        eventArgs.OldLeft = e.OldLeft
        eventArgs.NewTop = Me.TopRow
        RaiseEvent TopLeftChange(sender, eventArgs)
End Sub

10 个回复

倒序浏览
山水
初级会员   /  发表于:2013-7-30 14:06:00
沙发
您好,
在Spread 7中, 您可以增加TopChange和LeftChange事件,用来同步滚动两个不同的Spread Sheet。
一个示例:
在一个Form上增加两个Spread 控件, 使用如下例子代码:
Imports FarPoint.Win.Spread

Public Class Form1

    Public Sub New()

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        AddHandler Me.FpSpread1.TopChange, New TopChangeEventHandler(AddressOf Me.fpSpread1_TopChange)
        AddHandler Me.FpSpread1.LeftChange, New LeftChangeEventHandler(AddressOf Me.fpSpread1_LeftChange)
    End Sub

    Private Sub fpSpread1_LeftChange(ByVal sender As Object, ByVal e As LeftChangeEventArgs)
        Me.FpSpread2.SetViewportLeftColumn(0, e.NewLeft)
    End Sub

    Private Sub fpSpread1_TopChange(ByVal sender As Object, ByVal e As TopChangeEventArgs)
        Me.FpSpread2.SetViewportTopRow(0, e.NewTop)
    End Sub

End Class
回复 使用道具 举报
darkelf
论坛元老   /  发表于:2013-7-30 15:23:00
板凳
同步滚动这个已经完成了。

现在想要实现的是,TopRow和LeftCol这两个属性值修改时,触发TopRowChange或LeftColumnChange事件。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-7-30 19:16:00
地板
回复 3楼darkelf的帖子

问题正在处理中,明天回复。
回复 使用道具 举报
山水
初级会员   /  发表于:2013-7-31 09:48:00
5#
您好,
从您给的代码片段中,似乎你们重新继承了Spread后使用的。
因为代码不全,我猜把您的MyBase_TopChange 和MyBase_LeftChange事件处理器修改成   
Private Sub MyBase_TopChange(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.TopChangeEventArgs) Handles Me.TopChange
        RaiseEvent MyBase.TopChange(sender, e)
    End Sub
    Private Sub MyBase_LeftChange(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.LeftChangeEventArgs) Handles Me.LeftChange
        RaiseEvent MyBase.LeftChange(sender, e)
    End Sub

或者修改成如下,并增加TopChange和LeftChange事件处理器就行了 :
    Public Event TopChange(sender As Object, e As FarPoint.Win.Spread.TopChangeEventArgs)
    Public Event LeftChange(sender As Object, e As FarPoint.Win.Spread.LeftChangeEventArgs)

    Private Sub MyBase_TopChange(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.TopChangeEventArgs) Handles Me.TopChange
        RaiseEvent TopChange(sender, e)
    End Sub

    Private Sub MyBase_LeftChange(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.LeftChangeEventArgs) Handles Me.LeftChange
        RaiseEvent LeftChange(sender, e)
    End Sub

如果还不行,请设法制作一个demo,发到帖子上,我们帮您分析。
回复 使用道具 举报
darkelf
论坛元老   /  发表于:2013-7-31 12:45:00
6#
你好。很感谢你的回答。

不过目前的问题并不在事件上。我将TopRowChange和LeftColChange事件合并为一个TopLeftChange事件提供给新的Spread。
解决方案就是TopRowChange和LeftColChange事件触发后,执行自己定义的事件。
这部分没有问题。绑定的两个Sheet会同步滚动。

我想了解的是,如何在TopRow从1改变到2的时候,TopRow的属性处理中,触发TopRowChange事件。
也就是说,在属性改变的同时,触发TopRowChange事件。
回复 使用道具 举报
山水
初级会员   /  发表于:2013-7-31 15:41:00
7#
您好,
当设置TopRow属性时 (例如通过代码: MySpread.TopRow = 3), 因为在你们的代码里调用了:
SetViewportTopRow(0, value - 1)
所以基类Spread 的TopChange事件和你们派生类的TopLeftChange事件处理器 MyBase_TopChange()都会被自动触发,不需要在属性中增加什么事件或者再做其他事情。
在你们的MyBase_TopChange()中,有这样的代码:
RaiseEvent TopLeftChange(sender, eventArgs)
该句是调用您的TopLeftChange 事件处理器的真正代码。判断您到底有无TopLeftChange事件处理器,在该句上设一断点,按F11试图进入您的TopLeftChange事件处理器。若不能进入,说明您没有TopLeftChange 事件处理器。您应当参照2楼的代码增加它。
然后在该TopLeftChange 事件处理器中写同步两个sheet的代码。

解释一下: 你们的派生类中有TopLeftChange事件,它是为使用你们派生类的使用者而设,其对应的事件处理器只能由该使用者去增加。

如果仍然不能解决您的问题,建议您设法做一个包含你们必要代码能运行的demo程序,我们帮您分析、解决,以节约您的时间。
回复 使用道具 举报
darkelf
论坛元老   /  发表于:2013-8-3 10:14:00
8#
感谢您的回答。

在demo程序中,我确认了TopRow和LeftCol事件触发时,自定义TopLeftChange事件,并且正确实现了预期的动作。

问题出在实装程序中
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-8-5 18:36:00
9#
回复 8楼darkelf的帖子

如果仍然不能解决您的问题,建议您设法做一个包含你们必要代码能运行的demo程序,我们帮您分析、解决,以节约您的时间。
回复 使用道具 举报
darkelf
论坛元老   /  发表于:2013-8-7 21:15:00
10#
问题解决了。
原因不在自定义事件上。在于resumelayout这个函数。
在版本功能对照表中,旧版本的redraw属性,在7.0 Windows Form中,用FpSpread.ResumeLayout和 FpSpread.SuspendLayout来实现。

实际上,ResumeLayout 执行之后, 事件的触发也被停止了。 于是在事件未被触发的情况下,TopRow和LeftCol改变了。

现在在TopRow和LeftCol的设置前,执行SuspendLayout,事件触发就没问题了。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部