3

通常は多くのノードを持つ TreeView コントロールを持つ WinForm アプリがあり、Visual Studio の [戻る] および [進む] 機能のような機能を実装したいと考えています。

私の直観的な反応は、ここで説明されているようにスタック データ構造を使用することでした ( http://social.msdn.microsoft.com/Forums/vstudio/en-US/2771e9b7-115d-4d10-8b31-12a2497a7724/how-go-back- button-in-the-windows-works- )、ここにコピーしました:

Stack クラスを使用して、訪問した各ノードを保存します。ユーザーがノードをクリックすると、URL をまとめた Push メソッドが呼び出されます。戻る必要がある場合は、Stack クラスの Pop メソッドを呼び出すと、最後にアクセスしたノードが表示されます。もう一度呼び出すと、前のノードが表示され、そのように続行されます。追伸: Stack クラスは LIFO (Last In First Out) のコレクション型です

しかし、VS で Navigate Forward 機能がどのように機能するか、または考え直すことができれば理想的に機能するはずかどうかについて、私は混乱し始めています。その時、頭が痛くなり始めました。

ユーザーが次のノードにアクセスした場合

1,2,3,4

次に、[戻る] を 2 回押して、ノード 2 に移動します。

次に、ノード 5 をクリックします。

この時点で進むボタンを有効/利用可能にする必要がありますか? 使用されているアルゴリズムとデータ構造について説明してください。スタックを使用している場合、「戻る」と元の場所を失います。

では、対応する Navigate Forward 機能をどのように実装するのでしょうか? 私が行ってきたすべてのグーグルは、Web アプリのコーディングに関するブラウザー関連のヒントを見つけることであり、既に行われている一般的なアルゴリズムの誤った発明を避けるための小さな方向性を探しています。

あなたの考えは大歓迎です。

4

1 に答える 1

2

ほんの一例です。それが必要かどうかはわかりません。もちろん、ノード 1 から開始することもできます。配列内の特定の位置に新しい値を挿入し、他の値を配列の上に移動することもできます。

static void Main(string[] args)
        {
            string[] myValues = new[] { "1", "2", "3", "4" };
            Stack back = new Stack();
            Stack forward = new Stack();
            int maxPos = myValues.Length - 1;
            int minPos = 0;
            int currPos = myValues.Length - 1;
            Console.WriteLine("Initial Navigation Values {0}", string.Join(",", myValues));
            Console.WriteLine("User <- or -> keys to navigate between the values");
            Console.WriteLine("You are on Node 4");
            var key = Console.ReadKey().Key;
            while (key == ConsoleKey.LeftArrow || key == ConsoleKey.RightArrow)
            {
                if (currPos == minPos && key == ConsoleKey.LeftArrow)
                {
                    Console.WriteLine("You cannot navigate back anymore");
                    key = Console.ReadKey().Key;
                    continue;
                }
                if (currPos == maxPos && key == ConsoleKey.RightArrow)
                {
                    Console.WriteLine("You cannot navigate forward anymore");
                    key = Console.ReadKey().Key;
                    continue;
                }
                if (key == ConsoleKey.LeftArrow)
                {
                    forward.Push(myValues[currPos]);
                    currPos -= 1;
                }
                if (key == ConsoleKey.RightArrow)
                {
                    back.Push(forward.Pop());
                    currPos += 1;
                }
                Console.WriteLine("You are on Node {0}", myValues[currPos]);
                key = Console.ReadKey().Key;
            }
        }
于 2013-07-27T07:36:25.960 に答える