为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
ABOUTYOU 2022-01-15 16:46:23
所以我正在开发一个文本编辑器,使用菜单条作为所有内容的主要控制区域。在我的编辑选项卡中,我有一个撤消按钮,用于撤消键入的最后一个单词。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();               }}当我单击撤消时,它不会影响任何事情。我对编程很陌生,所以我看不到这个问题。有人可以启发我吗?
查看完整描述

1 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

我会得到你的问题的几行并向你解释:


Stack<string> undoList = new Stack<string>(); //Creates new EMPTY Stack

undoList.Push(txtMain.Text); //Add object to the top of the Stack

undoList.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)

{

    //it fires only when you enter textbox with mouse click/tab/etc

    //Here add your OLD VALUE to top  of stack

}


查看完整回答
反对 回复 2022-01-15
  • 1 回答
  • 0 关注
  • 176 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号