(C # Форма) Не могу получить кнопку отмены, чтобы фактически работать - PullRequest
0 голосов
/ 13 сентября 2018

Так что я работаю над текстовым редактором, используя полосу меню в качестве основной области управления для всего. На моей вкладке «Правка» есть кнопка «Отменить», которая предназначена для отмены последнего набранного слова.

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 Ответ

0 голосов
/ 14 сентября 2018

Я получу несколько строк вашего вопроса и объясню вам:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...