Я получу несколько строк вашего вопроса и объясню вам:
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
}