(C# 表单)无法使撤消按钮实际工作

所以我正在开发一个文本编辑器,使用菜单条作为所有内容的主要控制区域。在我的编辑选项卡中,我有一个撤消按钮,用于撤消键入的最后一个单词。


public partial class frmMain : Form

{

     Stack<string> undoList = new Stack<string>();


     private void txtMain_TextChanged(object sender, EventArgs e)

    {

        hasSaved = false;

        txtMain = (RichTextBox)sender;

        undoList.Push(txtMain.Text);

    }


    private void tsUndo_Click(object sender, EventArgs e)

    {

            undoList.Pop();           

    }

}

当我单击撤消时,它不会影响任何事情。我对编程很陌生,所以我看不到这个问题。有人可以启发我吗?


ABOUTYOU
浏览 177回答 1
1回答

郎朗坤

我会得到你的问题的几行并向你解释:Stack<string> undoList = new Stack<string>(); //Creates new EMPTY StackundoList.Push(txtMain.Text); //Add object to the top of the StackundoList.Pop(); //Removes object that is on top of the Stack所以现在你有了TextBox,当你输入一些东西时textbox.Text,它自己的属性会发生变化(而不是你影响它)。然后,除了将属性旧文本更改为顶部之外,您还创建event了“也” 。textPush()Stack现在,在文本更改后,您“拥有”(您没有,我稍后会解释)您的字符串位于stack您的顶部和内部textbox现在,当您按下Undo按钮时,您需要做两件事。将textBox.Text属性设置为堆栈中的顶部对象删除栈顶对象目前你正在做的只是第二件事:undoList.Pop();但是在此之前您忘记输入的是:textBox1.Text = undoList.Pop();这样,您将Text在堆栈顶部设置属性和删除对象。现在让我们把你还给我you do not have i will explain it later。我已经说过了,因为txtMain_TextChanged被解雇AFTER的文本被改变了。因此,当您txtMain.Text更改文本后,您将获得新值而不是旧值。此外,每次输入 1 个字符时,您都会更新旧文本。解决方案是使用Enter事件private void textBox1_Enter(object sender, EventArgs e){&nbsp; &nbsp; //it fires only when you enter textbox with mouse click/tab/etc&nbsp; &nbsp; //Here add your OLD VALUE to top&nbsp; of stack}
打开App,查看更多内容
随时随地看视频慕课网APP