找回密码
 立即注册

QQ登录

只需一步,快速开始

lh8350

论坛元老

33

主题

80

帖子

2万

积分

论坛元老

积分
23275

活字格认证

[已处理] 删除撤销问题

lh8350
论坛元老   /  发表于:2012-8-22 10:14  /   查看:7470  /  回复:8
private void Form1_Load(object sender, EventArgs e)

    {



        fpSpread1.ActiveSheet.Cells[0, 0].Locked = true;

        fpSpread1.ActiveSheet.Cells[0, 0].Value = 1;

        fpSpread1.ActiveSheet.Cells[1, 0].Locked = true;

        fpSpread1.ActiveSheet.Cells[1, 0].Value = 2;



        FarPoint.Win.Spread.InputMap im = new FarPoint.Win.Spread.InputMap();



        im = fpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenFocused);

        im.Put(new FarPoint.Win.Spread.Keystroke(Keys.Delete, Keys.None), FarPoint.Win.Spread.SpreadActions.ClearSelectedCells);



        im = fpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenAncestorOfFocused);

        im.Put(new FarPoint.Win.Spread.Keystroke(Keys.Delete, Keys.None), FarPoint.Win.Spread.SpreadActions.ClearSelectedCells);

    }

dof,我用上面的方式实现按del键删除数据后,怎么实现撤销功能呢?能不能只是删除选中区域的数据,而不删除背景色等,我搞了很久还是搞不出来。
参考了http://gcdn.grapecity.com/showto ... ;postid=27711#27711还是做不出来!用vb代码的那个demo做的话,又将锁定的单元格给删除了。头大,能不能帮我做个demo啊!万分感谢!

8 个回复

倒序浏览
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-8-22 18:34:00
沙发
lh8350 你好

这个功能确实实现起来不是那么容易,我这边也正在调试,明天继续和你沟通。
回复 使用道具 举报
jplzj
论坛元老   /  发表于:2012-8-23 10:45:00
板凳
将 Public Overrides Function PerformUndoAction(ByVal sender As Object) As Boolean
        Dim spreadView As FarPoint.Win.Spread.SpreadView = Nothing
        If TypeOf sender Is FarPoint.Win.Spread.SpreadView Then
            spreadView = CType(sender, FarPoint.Win.Spread.SpreadView)
        Else
            Return False
        End If

        If sheetView Is Nothing Then
            sheetView = spreadView.GetSheetView
        End If
        If (SaveUndoState()) And Not (sheetView Is Nothing) Then
            sheetView.ClearRange(cellRange.Row, cellRange.Column, cellRange.RowCount, cellRange.ColumnCount, False)
            Return True
        End If
        Return False
    End Function
将这个函数中“ sheetView.ClearRange(cellRange.Row, cellRange.Column, cellRange.RowCount, cellRange.ColumnCount, False)
”改为循环设置Cell.text=""就可以了
回复 使用道具 举报
lh8350
论坛元老   /  发表于:2012-8-24 13:51:00
地板
这样不可以哦!dof,你调试的有结果了吗?
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-8-24 17:29:00
5#
lh8350 你好

请参考这个帖子中,我最新的回帖,如有问题可以继续沟通:http://gcdn.grapecity.com/showtopic-5806.html
回复 使用道具 举报
lh8350
论坛元老   /  发表于:2012-8-27 16:17:00
6#
我参考了还是不会写,感觉问题比较难判断,因为我是先锁定的列,然后解除这些列中的某些单元格区域,对这些区域进行删除编辑等操作,撤销的时候不会写。
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-8-27 16:27:00
7#
lh8350 你好

你以上帖子中涉及到两个问题,1、按Delete键只清除单元格的内容,不清除单元格格式;2、Delete之后的撤销操作

第一个功能在http://gcdn.grapecity.com/showtopic-5806.html中给出了源码,不知该源码适合能够解决你的第一个需求。如果该功能没有问题,我可以在该功能基础上实现撤消操作。
回复 使用道具 举报
lh8350
论坛元老   /  发表于:2012-8-27 17:23:00
8#
http://gcdn.grapecity.com/showtopic-5806.html中给出的源码不能分辨单元格的锁定状态,一律删除,所以也不符合我的要求。我需要的是,如果有单元格锁定的区域就不能删除。
我觉得用下面的代码可以实现删除可编辑单元格的功能,但是撤销又做不出来。而且删除的时候将单元格的背景色和锁定状态都给清除了。
FarPoint.Win.Spread.InputMap im = new FarPoint.Win.Spread.InputMap();
                    im = spread.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenFocused);

                    im.Put(new FarPoint.Win.Spread.Keystroke(Keys.Delete, Keys.None), FarPoint.Win.Spread.SpreadActions.ClearSelectedCells);

                    im = spread.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenAncestorOfFocused);

                    im.Put(new FarPoint.Win.Spread.Keystroke(Keys.Delete, Keys.None), FarPoint.Win.Spread.SpreadActions.ClearSelectedCells);
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-8-27 18:03:00
9#
我修改了ClearValueAction增加Locked的判断,你再试一试:
  1.     public class ClearValueAction : FarPoint.Win.Spread.Action
  2.     {
  3.         public override void PerformAction(object source)
  4.         {
  5.             if (source is SpreadView)
  6.             {
  7.                 SpreadView spread = (SpreadView)source;
  8.                 SheetView sheet = spread.Sheets[spread.ActiveSheetIndex];
  9.                 CellRange cr = sheet.GetSelection(0);
  10.                 StyleInfo si = new StyleInfo();

  11.                 for (int r = 0; r < cr.RowCount; r++)
  12.                 {
  13.                     for (int c = 0; c < cr.ColumnCount; c++)
  14.                     {
  15.                         sheet.Models.Style.GetCompositeInfo(cr.Row + r, cr.Column + c, -1, si);
  16.                         if (!si.Locked)
  17.                         {
  18.                             sheet.Cells[cr.Row + r, cr.Column + c].ResetValue();
  19.                         }                       
  20.                     }
  21.                 }
  22.             }
  23.         }
  24.     }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部