【问题标题】:(C# Form) Can't get undo button to actually work(C# 表单)无法使撤消按钮实际工作
【发布时间】:2018-09-13 03:47:05
【问题描述】:

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

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();           
    }
}

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

【问题讨论】:

  • 您只是从数组中删除一个元素。你不会告诉按钮做某事。
  • 那是有道理的,你知道我应该使用什么代码来真正让按钮做我想做的事吗?
  • txtMain.Text = undoList.Pop(); ? .Pop() 所做的只是从 undoList 中删除该项目并将其返回给您。恐怕 C# 不是通灵的。
  • TextChanged 是错误的挂钩事件 - 您将每个字母缓存为 UnDo 项,无法分辨哪些字母组合在一起构成单词/句子/条目/单元

标签: c# winforms


【解决方案1】:

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

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,除了将text 属性Push() 旧文本更改为顶部的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
}

【讨论】:

    猜你喜欢
    • 2021-01-17
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    相关资源
    最近更新 更多