为WinForm TreeView控件实现“向后导航”和“向前导航”按钮功能

本文关键字:导航 功能 按钮 向前导航 TreeView WinForm 控件 实现 向后导航 | 更新日期: 2023-09-27 18:25:04

我有一个WinForm应用程序,其中有一个TreeView控件,通常有许多节点,我想实现Visual Studio的"向后导航"answers"向前导航"功能。

我的直觉反应是使用这里描述的堆栈数据结构(http://social.msdn.microsoft.com/Forums/vstudio/en-US/2771e9b7-115d-4d10-8b31-12a2497a7724/how-go-back-button-in-the-windows-works-),我复制到这里:

使用Stack类存储每个访问的节点。当用户单击节点时,调用Push方法来聚集url。当你需要返回时,在Stack类上调用Pop方法,它会给你最后一个访问过的节点,如果你再次调用它,它就会给你以前的节点,并以这种方式继续。Ps:Stack类是LIFO(后进先出)的集合类型

但我开始对"向前导航"功能在VS中的工作方式感到困惑,或者如果我能重新思考的话,它是否应该理想地工作。

如果用户访问了以下节点

1,2,3,4

然后反击两次到达节点2

然后单击节点5。

此时是否应该启用/提供前进按钮?请描述所使用的算法和数据结构。如果你使用的是一个堆栈,一旦你"回去",你就会失去你的来源。

那么,如何实现对应的"向前导航"功能呢?我一直在谷歌上搜索与浏览器相关的网页应用程序编码技巧,我正在寻找一个小方向,以避免错误地发明一种已经完成的常见算法。

欢迎您的想法。

为WinForm TreeView控件实现“向后导航”和“向前导航”按钮功能

只是一个例子。不确定这是否是你所需要的。当然,您也可以从节点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;
            }
        }