我有一個我的窗體上的TextBox.TextChanged事件的事件處理程序。爲了支持撤銷,我想弄清楚在TextBox中發生了什麼變化,以便在用戶請求時可以撤銷更改。 (我知道內置文本框支持撤消,但我希望有一個單一的撤消堆棧爲整個應用程序)C#和Winforms TextBox控件:如何獲取文本更改?
有沒有合理的方式來做到這一點?如果沒有,是否有更好的方法來支持這種撤銷功能?
編輯:像下面這樣的東西似乎工作 - 有沒有更好的想法? (它的幾次都是這樣,我真的希望.NET有這樣的事情了STL的std::mismatch
算法...
class TextModification
{
private string _OldValue;
public string OldValue
{
get
{
return _OldValue;
}
}
private string _NewValue;
public string NewValue
{
get
{
return _NewValue;
}
}
private int _Position;
public int Position
{
get
{
return _Position;
}
}
public TextModification(string oldValue, string newValue, int position)
{
_OldValue = oldValue;
_NewValue = newValue;
_Position = position;
}
public void RevertTextbox(System.Windows.Forms.TextBox tb)
{
tb.Text = tb.Text.Substring(0, Position) + OldValue + tb.Text.Substring(Position + NewValue.Length);
}
}
private Stack<TextModification> changes = new Stack<TextModification>();
private string OldTBText = "";
private bool undoing = false;
private void Undoit()
{
if (changes.Count == 0)
return;
undoing = true;
changes.Pop().RevertTextbox(tbFilter);
OldTBText = tbFilter.Text;
undoing = false;
}
private void UpdateUndoStatus(TextBox caller)
{
int changeStartLocation = 0;
int changeEndTBLocation = caller.Text.Length;
int changeEndOldLocation = OldTBText.Length;
while (changeStartLocation < Math.Min(changeEndOldLocation, changeEndTBLocation) &&
caller.Text[changeStartLocation] == OldTBText[changeStartLocation])
changeStartLocation++;
while (changeEndTBLocation > 1 && changeEndOldLocation > 1 &&
caller.Text[changeEndTBLocation-1] == OldTBText[changeEndOldLocation-1])
{
changeEndTBLocation--;
changeEndOldLocation--;
}
changes.Push(new TextModification(
OldTBText.Substring(changeStartLocation, changeEndOldLocation - changeStartLocation),
caller.Text.Substring(changeStartLocation, changeEndTBLocation - changeStartLocation),
changeStartLocation));
OldTBText = caller.Text;
}
private void tbFilter_TextChanged(object sender, EventArgs e)
{
if (!undoing)
UpdateUndoStatus((TextBox)sender);
}
嗯..這可能工作。 – 2010-04-21 16:54:30
您將在進入和離開時遇到問題。有一種反模式指的是事件的過度使用。 – 2010-04-21 23:44:17
@Daniel Dolz:「過度使用事件」?兩件事很難「過度」 – 2010-04-22 03:07:14