找回密码
 立即注册

QQ登录

只需一步,快速开始

haomi20032003

初级会员

29

主题

92

帖子

293

积分

初级会员

积分
293
haomi20032003
初级会员   /  发表于:2018-10-22 23:15  /   查看:5906  /  回复:14
https://www.grapecity.com.cn/blo ... nyuangeniantieshuju
我按照上面的帖子,实现了多单元格粘贴数据,但是不能实现撤销,请问如何解决,谢谢。

14 个回复

倒序浏览
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2018-10-23 11:09:17
沙发
如果要有undo的功能,您需要用action去实现。
http://help.grapecity.com/spread ... spwin-undoredo.html
在实现aciton的逻辑中实现undo
回复 使用道具 举报
haomi20032003
初级会员   /  发表于:2018-10-23 11:55:15
板凳
我找了这段代码,但是貌似只能恢复一次,不能连续恢复啊。。。

02.Public Class clearRangeAction
03.  Inherits FarPoint.Win.Spread.UndoRedo.UndoAction
04.
05.  Dim sheetView As FarPoint.Win.Spread.SheetView
06.  Dim cellRange As FarPoint.Win.Spread.Model.CellRange
07.  Dim rowInfo As FarPoint.Win.Spread.RowClipInfoRange
08.  Dim columnInfo As FarPoint.Win.Spread.ColumnClipInfoRange
09.  Dim cellInfo As FarPoint.Win.Spread.CellInfoRange
10.
11.  Public Sub New()
12.
13.  End Sub
14.
15.  Public Sub New(ByVal sheetView As FarPoint.Win.Spread.SheetView, ByVal cellRange As FarPoint.Win.Spread.Model.CellRange)
16.    Me.sheetView = sheetView
17.    Me.cellRange = cellRange
18.  End Sub
19.
20.  Public Overrides Function PerformUndoAction(ByVal sender As Object) As Boolean
21.    Dim spreadView As FarPoint.Win.Spread.SpreadView = Nothing
22.    If TypeOf sender Is FarPoint.Win.Spread.SpreadView Then
23.      spreadView = CType(sender, FarPoint.Win.Spread.SpreadView)
24.    Else
25.      Return False
26.    End If
27.
28.    If sheetView Is Nothing Then
29.      sheetView = spreadView.GetSheetView
30.    End If
31.    If (SaveUndoState()) And Not (sheetView Is Nothing) Then
32.      sheetView.ClearRange(cellRange.Row, cellRange.Column, cellRange.RowCount, cellRange.ColumnCount, False)
33.      Return True
34.    End If
35.    Return False
36.  End Function
37.
38.  Protected Overrides Function SaveUndoState() As Boolean
39.    If Not (sheetView Is Nothing) Then
40.      If cellRange Is Nothing Then
41.        cellRange = sheetView.GetSelection(0)
42.        If cellRange Is Nothing Then
43.          cellRange = New FarPoint.Win.Spread.Model.CellRange(sheetView.ActiveRowIndex, sheetView.ActiveColumnIndex, 1, 1)
44.        End If
45.      End If
46.      If Not (cellRange Is Nothing) Then
47.        If (cellRange.IsValidRange(sheetView, False)) Then
48.          cellInfo = FarPoint.Win.Spread.CellInfoRange.FromCellRange(sheetView, cellRange, rowInfo, columnInfo)
49.        End If
50.      End If
51.    End If
52.    Return Not (cellInfo Is Nothing)
53.  End Function
54.
55.  Public Overrides Function Undo(ByVal sender As Object) As Boolean
56.    Dim spreadView As FarPoint.Win.Spread.SpreadView = Nothing
57.    If TypeOf sender Is FarPoint.Win.Spread.SpreadView Then
58.      spreadView = CType(sender, FarPoint.Win.Spread.SpreadView)
59.    Else
60.      Return False
61.    End If
62.
63.    If (cellRange.IsValidRange(sheetView, False)) Then
64.      If Not (cellInfo Is Nothing) Then
65.        Dim dataObject As New DataObject()
66.        dataObject.SetData(cellInfo)
67.        If Not (columnInfo Is Nothing) Then
68.          dataObject.SetData(columnInfo)
69.        End If
70.        If Not (rowInfo Is Nothing) Then
71.          dataObject.SetData(rowInfo)
72.        End If
73.        If Not (sheetView.ActiveRowIndex = cellRange.Row) Or Not (sheetView.ActiveColumnIndex = cellRange.Column) Then
74.          sheetView.SetActiveCell(cellRange.Row, cellRange.Column)
75.        End If
76.        sheetView.ClipboardPaste(FarPoint.Win.Spread.ClipboardPasteOptions.All, dataObject)
77.        Return True
78.      End If
79.    End If
80.    Return False
81.
82.  End Function
83.
84.End Class
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2018-10-23 16:58:43
地板
您这边发个Demo给我,我看看。
回复 使用道具 举报
haomi20032003
初级会员   /  发表于:2018-10-24 08:56:26
5#
谢谢版主,已经好了,在调用的时候加上undomanager就行
Dim undo_action As User_define_Undoaction = New User_define_Undoaction(FpSpread1.ActiveSheet, FpSpread1.ActiveSheet.GetSelection(0))
                FpSpread1.UndoManager.PerformUndoAction(undo_action)

但是目前还有一个问题,我是在fpSpread1_ClipboardPasting事件中调用了这个自定义的undomanager,程序不能执行,如果做一个按钮就可以执行,是不是因为ClipboardPasting中不能响应这个事件?如何处理?谢谢
回复 使用道具 举报
haomi20032003
初级会员   /  发表于:2018-10-24 19:47:58
6#
搞定了,加一句FpSpread1.UndoManager.CancelAction(),取消ClipboardPasting事件

评分

参与人数 1金币 +500 收起 理由
dexteryao + 500 很给力!

查看全部评分

回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2018-10-25 09:11:44
7#
本帖最后由 dexteryao 于 2018-10-25 09:13 编辑



您这个很棒,以后可以让别的用户参考

还可以将ctrl+V的 action解绑,设置为你这样action,替换原有的action。

Pasting事件里面也可以通过e.Cancel 取消掉当前的粘贴行为
回复 使用道具 举报
haomi20032003
初级会员   /  发表于:2018-10-25 11:40:29
8#
发上来就是以后别的用户搜索到这个能参考,不过怎么解绑action?
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2018-10-25 22:16:15
9#
参考http://help.grapecity.com/spread ... aps-defaultoff.html
put一个SpreadActions.None就是这个快捷键什么都不做了。
参考http://help.grapecity.com/spread ... in-maps-action.html
可以把你定义的action绑定到快捷键上
回复 使用道具 举报
haomi20032003
初级会员   /  发表于:2018-10-29 15:36:49
10#
这样做其实还有一个问题,如果在输入后排序一下,就无法撤销了。我们还有一列唯一列,可以通过这个属性定位到排序后的行
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部