C#でUNDOを開発する簡単な方法を知りたい
私はウィンドウフォームアプリケーションを持っています、ウィンドウにはたくさんのテキストボックスがあるフォームがあります、ボックスを選択し、チェックボックス...
ユーザーが入力して計算ボタンをクリックすると、プログラムはすべての入力に従って計算し、画面に値を返します。
私はすべての計算の後に状態を保存する簡単な方法を検索し、ユーザーに1つ以上のステップを返す機能を提供します。
ありがとう
標準が組み込まれているとは思いませんが、自分でそれを行うためのフレームワークをいくつか見つけることができます。フォームのサンプルを含むUndoフレームワーク: Undoフレームワークのサンプル
MonitoredUndoFrameworkもあります。
単純な実装はスタックです。ユーザーが操作を実行するときに、現在の値をスタックにプッシュします。'元に戻す'ときに、スタックから値をポップします。
最も簡単な方法は、入力テキストをどこかに保存することです。
どういうわけか、最後に入力が保存されたときから変更されたテキストだけをエンコードすることで、より凝ったものを得ることができます。たとえば、追加された位置とともに追加された新しいテキストのみを保存できます。または、削除されたテキストの位置と長さのみを保存することもできます。しかし、それはもっと複雑で、効果は同じです。
テキストボックスには単純な元に戻す機能が組み込まれていますが、それが機能しない場合は、各元に戻すポイントでテキストを保存する必要があります。それは簡単で、シンプルで、必要です。
テキストボックスを使用している場合。`Undo()メソッドnを使用して、1ステップ前に元に戻すことができます
txtBoxResult.Undo();
かなり遅いですが、昨日友人から問い合わせがありました。
このシンプルな元に戻るREDO機能をrichtextboxで開発しました。はい、もっと良い方法はたくさんありますが、簡単な解決策として使用できます。
using System;
using System.Windows.Forms;
namespace Undo_Redo
{
public partial class Form1 : Form
{
public string[] RTBRedoUndo;
public int StackCount = -1;
public bool IsRedoUndo = false;
public string[] RTBRedo;
public int RedoStackCount = -1;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
RTBRedoUndo = new string[10000];
RTBRedo = new string[10000];
}
private void btn_undo_Click(object sender, EventArgs e)
{
if (StackCount > -1 && RTBRedoUndo[StackCount] != null)
{
IsRedoUndo = true;
RedoStackCount += 1;
RTBRedo[RedoStackCount] = RTBRedoUndo[StackCount];
richTextBox1.Text = richTextBox1.Text.Substring(0, richTextBox1.Text.Length - 1);
RTBRedoUndo[StackCount] = null;
StackCount -= 1;
}
}
private void btn_redo_Click(object sender, EventArgs e)
{
if (RedoStackCount > -1 && RTBRedo[RedoStackCount] != null)
{
IsRedoUndo = true;
StackCount += 1;
RTBRedoUndo[StackCount] = RTBRedo[RedoStackCount];
richTextBox1.Text = richTextBox1.Text + RTBRedo[RedoStackCount];
RTBRedo[RedoStackCount] = null;
RedoStackCount -= 1;
}
}
private void btn_redo_MouseUp(object sender, MouseEventArgs e)
{
IsRedoUndo = false;
}
private void btn_undo_MouseUp(object sender, MouseEventArgs e)
{
IsRedoUndo = false;
}
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
if (IsRedoUndo == false)
{
StackCount += 1;
RTBRedoUndo[StackCount] = richTextBox1.Text.Substring(richTextBox1.Text.Length - 1, 1);
}
}
}
}