5

TextBoxの非常に単純な元に戻す機能に取り組んでいますが、奇妙な問題が発生しています。すべての変更を保持しているから文字列を取得してテキストボックス内に配置しようとするStackと、変更が表示されません。

これが実際に機能しているかどうかを確認するために、小さなデバッグラベルを作成しました。ラベルで機能していることがわかりましたが、テキストボックスでは独自の元に戻す機能を使用しています。

テキストボックスの元に戻すをキャンセルまたはオーバーライドして、独自の関数を使用する方法はありますか?

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

 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いるからでしょうか?

4

3 に答える 3

4

ClearUndoメソッドを使用して、テキストボックス自体のスタックをクリアします。これを試して:

nameTextBox.ClearUndo();
nameTextBox.Text = undoName.GetLastChange();
于 2012-10-20T17:39:00.037 に答える
3

System.Windows.Forms.TextBoxから継承することにより、履歴を処理する独自のTextBoxを作成できます。私のサンプルを見てください:

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

元に戻す必要があるときはいつでも、電話するだけです。

historyTextBox1.Undo();

このクラスでは、複数の履歴レコードが提供されます。

于 2012-10-20T17:49:41.200 に答える
2

GeregorKeyboardの答えを拡張しました。Visual Studio 2017に投稿されているようにコードを機能させることができなかったため、微調整を行いました。次に、REDO関数も必要だったので、さらに数行のコードを追加しました。これは私のテストではうまく機能しているようで、質問に答えて拡張するので共有したいと思いました。

このコードは元に戻す、やり直しを追加し、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;
            }
        }
    }
}
于 2018-03-06T14:38:52.050 に答える