2012-10-20 10 views
5

私はTextBoxの非常に単純な元に戻す機能を開発中で、奇妙な問題があります。私がStackからすべての変更を保持している文字列をTextboxの中に入れようとすると、私は何の変更も見ません。テキストボックスの機能を元に戻す

これが実際に動作しているかどうかを確認するために、少しデバッグラベルを作成しました。 ラベルで作業していることがわかりましたが、Textboxでは独自の元に戻す機能が使用されています。

テキストボックスの元に戻して無効にする方法はありますか?

private void Form1_KeyDown(object sender, KeyEventArgs e) 
     if (e.KeyCode == Keys.Z && (ModifierKeys & Keys.Control) == Keys.Control) 
      { 
       nameTextBox.Text = undoName.GetLastChange(); //--> not working 

       undoDebuglabel.Text = undoName.GetLastChange(); --> working 
      } 
} 

GetLastChange()はクラスの内部Stackから情報を取得している:

は、ここで私が行った変更からのサンプルコードです。

テキストボックスのように私に変更を見せられないようです。 同じショートカット、CTRL + Zを使用している可能性がありますか?

+0

あなたが投稿したコードはうまく動作します。 –

+0

あなたのテキストボックス内のスタックからの変更を確認できますか? – samy

+0

はい。明らかに、私はあなたがそれを埋めるために行う正確なコードを持っていませんが、コンセプトは同じです。 –

答えて

4

ClearUndoメソッドを使用して、テキストボックスのスタックをクリアします。試してみてください:

+0

ああ、申し訳ありませんが私はそれを逃した。 – keyboardP

+0

WinFormの代替方法で更新されました。 – keyboardP

+0

はいその作業thx! – samy

3

独自のTextBoxを作成して、System.Windows.Forms.TextBoxから継承して履歴を処理することができます。 私のサンプルを見てみましょう:

historyTextBox1.Undo(); 

をこのクラスはあなたに複数のhistoyレコードを与える:あなただけの呼び出し元に戻す必要が

public class HistoryTextBox: System.Windows.Forms.TextBox 
{ 
    bool ignoreChange = false; 
    List<string> storage = null; 


    protected override void OnCreateControl() 
    { 
     base.OnCreateControl(); 
     //init storage... 
     storage = new List<string>(); 
    } 

    protected override void OnTextChanged(EventArgs e) 
    { 
     base.OnTextChanged(e); 
     //save change to storage... 
     if (!ignoreChange) 
     { 
      storage.Add(this.Text); 
     } 
    } 

    public void Undo() 
    { 
     if (storage.Count > 0) 
     { 
      this.ignoreChange = true; 
      this.Text = storage[storage.Count - 1]; 
      storage.RemoveAt(storage.Count - 1); 
      this.ignoreChange = false; 
     } 
    } 
} 

毎回。

+0

定義でignoreChangeをfalseに設定し、記憶変数の後のOnCreateControlでtrueに設定する必要がありました。私はOnTextChangedのストレージ変数の起動時にnullを取得していました。これは、TextBoxがデフォルトのテキストで開始され、OnTextChangedを早期に起動していたためだと思います。 –

0

私はに拡大しました。Geregorキーボードの答えです。私は、Visual Studio 2017で投稿されたコードを動作させることができなかったので、マイナーな調整が行われました。次に、やり直し機能も欲しかったので、もう少しコードを追加しました。これは私のテストでうまくいくように思え、質問に答えて展開するので分け合うと思った。

このコードは、元に戻す、やり直しを追加します。Ctrl-ZまたはCtrl-Yを押し続けると、リスト内を「実行」できます。

using System; 
using System.Collections.Generic; 
using System.Windows.Forms; 

namespace CodeBuilder 
{ 
    public class HistoryTextBox : System.Windows.Forms.TextBox 
    { 
     bool ignoreChange = true; 
     List<string> storageUndo = null; 
     List<string> storageRedo = null; 


     protected override void OnCreateControl() 
     { 
      base.OnCreateControl(); 
      storageUndo = new List<string>(); 
      storageRedo = new List<string>(); 
      ignoreChange = false; 
     } 

     protected override void OnTextChanged(EventArgs e) 
     { 
      base.OnTextChanged(e); 
      if (!ignoreChange) 
      { 
       this.ClearUndo(); 
       if (storageUndo.Count > 2048) storageUndo.RemoveAt(0); 
       if (storageRedo.Count > 2048) storageRedo.RemoveAt(0); 

       storageUndo.Add(this.Text); 
      } 
     } 

     protected override void OnKeyDown(KeyEventArgs e) 
     { 

      if (e.KeyCode == Keys.Z && (ModifierKeys & Keys.Control) == Keys.Control) 
      { 
       this.ClearUndo(); 
       ignoreChange = true; 
       this.Undo(); 
       ignoreChange = false; 
      } 
      else if (e.KeyCode == Keys.Y && (ModifierKeys & Keys.Control) == Keys.Control) 
      { 
       this.ClearUndo(); 
       ignoreChange = true; 
       this.Redo(); 
       ignoreChange = false; 
      } 
      else 
      { 
       base.OnKeyDown(e); 
      } 
     } 

     public void Redo() 
     { 
      if (storageRedo.Count > 0) 
      { 
       this.ignoreChange = true; 
       this.Text = storageRedo[storageRedo.Count - 1]; 
       storageUndo.Add(this.Text); 
       storageRedo.RemoveAt(storageRedo.Count - 1); 
       this.ignoreChange = false; 
      } 
     } 

     public new void Undo() 
     { 
      if (storageUndo.Count > 0) 
      { 
       this.ignoreChange = true; 
       storageRedo.Add(this.Text); 
       this.Text = storageUndo[storageUndo.Count - 1]; 
       storageUndo.RemoveAt(storageUndo.Count - 1); 
       this.ignoreChange = false; 
      } 
     } 
    } 
} 
関連する問題