C#文本框TextBox使用问题

在文本框中输入一些操作,按Ctrl+Z就可以撤销,及返回上一步的操作可是文本框只能够保存一步操作,如何保存多步操作呢,通过哪个属性可以实现如像VisualStudio按按... 在文本框中输入一些操作,按Ctrl+Z就可以撤销,及返回上一步的操作
可是文本框只能够保存一步操作,如何保存多步操作呢,通过哪个属性可以实现
如像VisualStudio按按Ctrl+Z,就返回上一步操作,再按就返回上一步的上一步,继续按就……
展开
 我来答
freeeeeewind
2013-11-06 · TA获得超过1万个赞
知道大有可为答主
回答量:3227
采纳率:94%
帮助的人:1292万
展开全部

1)在Form1上拖入两个TexBox,分别为textBox1和textBox2。textBox1用来显示输入的文本;textBox2用来输入文本。

2)在Form1.cs中添加一个类TextUndoBuffer。代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        TextUndoBuffer buffer;

        private void Form1_Load(object sender, EventArgs e)
        {
            buffer = new TextUndoBuffer();
        }

        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            //按下Ctrl+z,取消最近一次输入的内容
            if (e.KeyCode == Keys.Z && e.Modifiers == Keys.Control)
            {
                buffer.Undo();
                textBox1.Text = buffer.GetAll();
            }
        }

        private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Return)
            {
                string s = textBox2.Text.Trim();
                if (s != string.Empty)
                {
                    buffer.PutInBuffer(" " + textBox2.Text.Trim());
                    textBox2.Clear();
                    textBox1.Text = buffer.GetAll();
                }
            }
        }

    }

    /// <summary>
    /// 这个类用来记录输入的内容并支持Undo
    /// </summary>
    class TextUndoBuffer
    {

        List<string> buffer;

        public TextUndoBuffer()
        {
            this.buffer = new List<string>();
        }

        /// <summary>
        /// 将输入的一句话放入缓冲区
        /// </summary>
        /// <param name="s"></param>
        public void PutInBuffer(string s)
        {
            this.buffer.Add(s);
        }

        /// <summary>
        /// 从缓冲区获取所有输入的内容
        /// </summary>
        /// <returns></returns>
        public string GetAll()
        {
            string s = string.Empty;
            foreach (var q in this.buffer)
            {
                s += q;
            }
            return s;
        }

        /// <summary>
        /// Undos实现取消最近一次输入的内容
        /// </summary>
        public void Undo()
        {
            if (this.buffer.Count == 0) return;
            buffer.RemoveAt(this.buffer.Count - 1);
        }
    }
}

3)事件处理

注意:textBox1和textBox2“共用”了同一个KeyDown事件处理函数,详细见上面代码

岁月恋云
2013-11-06 · 超过54用户采纳过TA的回答
知道小有建树答主
回答量:210
采纳率:0%
帮助的人:101万
展开全部
你用一个数组记录你的操作,然后按撤销顺序读取,不知是否可行?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-11-06
展开全部
把问题说清楚
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友95005f4
2013-11-06 · 超过47用户采纳过TA的回答
知道小有建树答主
回答量:111
采纳率:0%
帮助的人:93.4万
展开全部
用richTextBox
追问
貌似也不行啊
追答
richTextBox应该是可以的啊,我用的是VS2010
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式