撤销和恢复

c# datagridview 撤销/恢复 (undo/redo) c# datagridview 撤销/恢复 立即下载

         在GIS地图数据编辑中,撤销和恢复功能也算是基本功能了,那么如何设计一个简单高效的编辑撤销和恢复模块也显得比较重要,这里本人也是用C#写了一个简单的撤销和恢复功能供大家参考,有更好的方法请不吝指教。

        设计接口:IDoable,凡是需要具有撤销和恢复功能的类都必须要实现此接口,代码如下:

    public interface IDoable
    {
        bool CanUndo();
        bool CanRedo();
        void Undo();
        void Redo();
    }

       设计泛型接口:IDoManager<T>,这个类作为需要有撤销和恢复功能的类的一个成员变量,主要用来辅助管理撤销和恢复的一些数据存储和读取,代码如下:

    interface IDoManager<T>
    {
        void PushData(T data);
        T PopData();
        void ClearDatas();
        void SetUndoLen(int len);
        bool CanUndo();
        bool CanRedo();
    }

       IDoManager<T>接口的实现类DoManager<T>:

    public class DoManager<T> : IDoManager<T>
    {

        private Queue<T> _datas;
        private int _len = 8;
        private int _cur = -1;

        public DoManager()
        {
            _datas = new Queue<T>(_len);
        }

        #region IDoManager<T> 成员

        public void PushData(T data)
        {
            if (_cur < _len)
            {
                _cur++;
                _datas.Enqueue(data);
            }
            else
            {
                _datas.Dequeue();
                _datas.Enqueue(data);
            }
        }

        public void ClearDatas()
        {
            _datas.Clear();
            _cur = -1;
        }

        public void SetUndoLen(int len)
        {
            _datas.Clear();
            _len = len;
        }

        public T PopData()
        {
            return _datas.ToArray()[_cur--];
        }

        public bool CanUndo()
        {
            if (_cur < _len)
                return true;
            return false;
        }

        public bool CanRedo()
        {
            if (_cur > -1)
                return true;
            else return false;
        }

        #endregion
    }

   

       如上几行简单的代码就实现了一个具有撤销和恢复功能的基本接口和基础类的实现。

       这里写一个简单的小例子来作为测试,如地图中,我们需要编辑数据,假如是采集面数据,采集面的时候可以支持撤销和恢复,废话不多说,具体见代码:

    public class Polygon:IDoable
    {
        private List<Point> _points = new List<Point>();
        private DoManager<Point> _doManager = new DoManager<Point>();

        public List<Point> Points
        {
            get { return _points; }
            set { _points = value; }
        }

        public Polygon()
        {
            _doManager.SetUndoLen(100);
        }

        public void AddPoint(Point pt)
        {
            _points.Add(pt);
        }



        #region IDoable 成员

        public bool CanUndo()
        {
            if (_doManager.CanUndo() && _points.Count > 1)
                return true;
            return false;
        }

        public bool CanRedo()
        {
            if (_doManager.CanRedo())
                return true;
            return false;
        }

        public void Undo()
        {
            if (CanUndo())
            {
                _doManager.PushData(_points[_points.Count - 1]);
                _points.RemoveAt(_points.Count - 1);
            }
        }

        public void Redo()
        {
            if (CanRedo())
            {
                _points.Add(_doManager.PopData());
            }
        }

        #endregion
    }


       测试方法:运行工程中demo,如下图所示,点击界面白颜色部分采集点,点击上方的撤销按钮撤销,点击上方的恢复按钮恢复撤销。

       效果如下:



删除当前节点以及子节点 因为工作需要,所以自己写了一个简单的删除子节点的操作,同时,注意,如果使用加强for循环,就不能用remove()方法,因为,加强的for循环是使用的迭代器,而迭代器在做remove()的时候会抛异常。 立即下载

相关推荐

撤销重做C++框架Demo,VS2010 MFC工程

撤销重做C++框架Demo,VS2010 MFC工程

C# wpf 实现自定义撤销重做功能

做wpf界面的时候有时需要撤销重做功能,虽然一些wpf控件自带撤销功能,但是在一些复杂的场景还是需要自己实现撤销重做功能,比如自定义的白板或者视频剪辑器等等,本文将介绍如何简单的实现一个撤销重做对象,并提供使用示例。...............

codeofcc的博客 2175

c#设计的GIS(附代码)

用c#设计的简单的gis系统,附c#代码,有兴趣的朋友可以多了解一下。

测试下撤销的功能

通过之前的学习我们可以知道,在存储数据的时候我们需要开辟一块内存空间,但是数据是如何放到这一块内存空间里面的呢?首先我们需要将其分为两种:有符号数和无符号数。在vs编译器中int 类型默认是有符号的,但是在不同的编译器中int 类型并不一定总是默认有符号的 上面是复制了一段 11:40 再手敲几个字,加加加 .........

zuorucsdn 315

Arcengine Element撤销重做 undo redo

这里面有两种方式的Element 撤销和重做,一种是自己去实现,另外一种是调用arcgis自带的工具去实现

深入解析set_input_delay:从理论到实践的关键时序约束

本文深入解析了FPGA/ASIC设计中关键的时序约束命令set_input_delay,从理论到实践详细阐述了其工作原理。文章重点讲解了如何结合setup time和hold time,通过计算-max与-min值来精确描述外部延迟,确保芯片内部逻辑能稳定捕获数据,并介绍了虚拟时钟、DDR接口约束等实战技巧与常见陷阱。

weixin_29313423的博客 316

测试用例-微信消息撤回

对微信消息撤回场景,进行了以下几个方面的测试用例设计;分别是功能、性能、兼容性、安全性、易用性

STAR 1840

C#实战:如何用TSCLIB.dll实现TSC打印机的状态监控与异常处理(附完整代码)

本文详细介绍了如何利用C#和TSCLIB.dll构建企业级TSC打印机状态监控与智能异常处理系统。通过解析十六进制状态码、设计高可靠性的轮询引擎以及实现事件驱动的报警机制,开发者可以打造一个稳定、可观测的打印服务,有效保障物流仓储、生产制造等高频打印场景的业务连续性。

weixin_29227585的博客 64

openlayers 6绘画(2)-- 取消绘画

前言 本来我是想写一个,在规定区域内绘画,并且他们之间不能那个相互交互重叠的效果,然后今天看到了一个大佬写得返回上一步的操作我觉得很好玩。so,就改成了这样,ctrl+z和ctrl+y的效果。 绘画时难免会遇到问题,撤销是一个很有用的方法。 直接上代码: 1.代码 代码如下: <template> <div id="map" ref="map"></div> </template> <script> import "ol/ol.css"; im

zwszh的博客 2499

手把手教你用XC7A35T FPGA搭建低成本机器视觉系统(含开发板选型指南)

本文详细介绍了如何利用AMD(原Xilinx)Artix-7系列中的XC7A35T FPGA芯片,搭建一套低成本的机器视觉系统。内容涵盖从芯片选型深度剖析、开发板(如黑金AX7035B)对比指南,到使用Vivado创建工程、编写图像处理模块(如RGB转灰度),以及资源优化和与上位机(如OpenCV)协同工作的完整流程,旨在为开发者提供一套可实践的高性价比硬件加速视觉解决方案。

beta5的博客 353

基于ESP32与PCM5102的WiFi无损音频传输系统设计与实现

本文详细介绍基于ESP32与PCM5102的WiFi无损音频传输系统设计与实现。通过I2S接口直接传输PCM数据,避免SRC重采样,实现真正的HIFI级音质。涵盖硬件连接、软件架构、网络传输优化及实际音质对比,为音频爱好者提供高性价比的无损无线音频解决方案。

rnn9storyteller的博客 948

Linux Vim撤销和恢复撤销快捷键

然后按“Esc”键,使 Vim 由输入模式转为命令模式,并使用 yy 命令将这一行文本复制到剪贴板中,如此我们就可以在文本任意位置通过键入 p(或大写的 P)命令将复制的内容粘贴到光标所在的位置。在此基础上,通过 u(小写)命令就可以使文本内容恢复到上一次做粘贴操作之前的样子,其中“上一次”的含义是,恢复操作是可以叠加的,即按一次就会在现有基础上做一次恢复操作。同样,恢复撤销的操作和撤销操作是相对应的,通过按 Ctrl+R 组合键,可以撤销之前所做的一次恢复操作。

shiwei0813的博客 1万+

【EB-02】TC397 Tresos 最小工程配置

主要设置McalLibPublishedInformation 参数,会根据ResourceM配置的芯片自动加载。可以看到再工程目录中生成了output文件夹,里面由这些模块生成的头文件,编译脚本和epc文件。如果选择生成swcd,可以生成xxx_Bswmd.arxml给别的工具使用。如果没有Error和Problems就可以点击生成代码。点击工程校验看看工程是否由错误。

libuping2023的博客 324

撤销 恢复快捷键 Linux,Linux Vim撤销和恢复撤销快捷键用法详解

使用 Vim 编辑文件内容时,经常会有如下 2 种需求:对文件内容做了修改之后,却发现整个修改过程是错误或者没有必要的,想将文件恢复到修改之前的样子。将文件内容恢复之后,经过仔细考虑,又感觉还是刚才修改过的内容更好,想撤销之前做的恢复操作。基于这 2 种需求,Vim 编辑器提供了撤销和恢复撤销的命令,如表 1 所示。表 1 Linux Vim 撤销和恢复撤销快捷键快捷键功能u(小写)undo 的第...

weixin_30124601的博客 1297

AI 模型优化与部署秘籍:从理论到实战

本文系统介绍了AI模型优化与部署的关键技术。模型剪枝通过去除冗余参数减小模型规模,量化技术降低计算精度以提升效率,蒸馏方法实现知识从大模型到小模型的迁移。TensorRT通过层融合和精度校准加速GPU推理,ONNX格式实现跨框架模型转换,TFLite则优化移动端部署。这些技术共同解决了AI模型在资源受限环境下的部署难题,显著提升了模型运行效率,为AI应用落地提供了重要支撑。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 246

一文搞懂YOLO各版本差异:v5易用、v8多任务、v10低延迟,该怎么选?

YOLOv5的“易用”是为了降低入门门槛,适合新手启蒙和旧项目维护;YOLOv8的“多任务”是为了满足工业需求,成为目前的主流版本;YOLOv10的“低延迟”是为了适配边缘计算,代表未来的发展趋势。选型的核心不是“选最新的”,而是“选最适合自己场景的”。记住选型口诀,按场景对号入座,就能避开99%的坑。希望这篇文章能帮你彻底搞懂各版本差异,选对属于自己的YOLO版本!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1169

java文本的撤销和恢复

文本的撤销和恢复是通过 addUndoableEditListener(UndoableEditListener listener)这个方法来注册实现的。只要是Document类及其子类都可以注册撤销和恢复的监听来实现文档的撤销和恢复,这是非常容易实现的。所以JTextField,JTextArea,JTextPane都可以实现撤销和恢复功能。因为他们都可以获得Document实例,通过这个方法-...

890

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

react撤销和恢复

如果是撤销操作,,就从这个历史栈中取最后面那个数据,,并且将这个数据push到future栈中,,,,,在每次操作store的时候,将当前的store的数据,存入历史记录栈。如果是恢复操作,,就去future栈中的最后的那一个数据,用来恢复原数据。

qq_36022463的博客 414

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

fabric.js 画板进行撤销、恢复和保存操作(上一步/下一步)

fabric.js 撤销、恢复和保存操作(上一步/下一步) const state = { saveLen: 0, deleLen: 0, operIndex: -1 } window.saveOperateList = [] window.deleteOperateList = [] const getters = { } const mutations = { // 操作保存的数据 OPERATE_OPERATE_DATA (state) {

guoqkmiss的博客 6648

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

python中Tkinter做记事本撤销和恢复的设计

内部已经有了撤销和恢复的方法,但是中间会有一个bug,就是如果没有内容可以撤销或者是没有内容可以恢复,所以要防止bug的产生,还有就是防止一次把之前插入的一行数据全部删除,设置每一次只能删除一个字符。 #!/usr/bin/python #coding: utf-8 from Tkinter import * root = Tk() text = Text(root, undo = Tru

You_are_my_dream的博客 3007

【vim】撤销和恢复撤销快捷键

vim 撤销和恢复快捷键

ccf19881030的专栏 6001

vim撤销和恢复撤销操作

1.vim撤销操作 将vim调整到命令模式 键入小写u 2.恢复撤销操作 将vim调整到命令模式 键入Ctrl + r

欢迎来到道的世界 4292

ubuntu vim 撤销和恢复操作

vim撤销操作:u vim恢复操作:ctrl+r

nezhaxiaopengyou的博客 5467

vue实现的一个撤销和恢复功能

使用vue实现得一个撤销和回退功能 有三个表格 添加不同得数据 在点击撤销时删除最后一条添加得数,在点击恢复删除的数据 <template> <div style="width:1000px;margin:0 auto"> <Button type="info" @click="handleOk">添加</Button> <Table :columns="columns" :data="datas"><

qq_42783273的博客 6759

vim撤销上次操作_操作系统【14】Linux Vim撤销和恢复撤销快捷键用法

说到区块链,必讲比特币。使用 Vim 编辑文件内容时,会经常出现对修改的内容不满意或者是说没有必要修改,想把文件改回原来的样子。或者说将文件内容恢复到原来的内容后,又发现修改的内容更加准确,想撤销恢复操作,基于这样的情况,vim编辑器提供了撤销和恢复的命令。快捷键功能u(小写)undo 的第 1 个字母,功能是撤销最近一次对文本做的修改操作。Ctrl+RRedo 的第 1 个字母,功能...

weixin_39700063的博客 3603
上一篇: C++回调函数封装成C#委托测试
下一篇: C/C++开源库——TinyXml
修哥
博客等级 码龄14年 71粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值