65.9K
CodeProject 正在变化。 阅读更多。
Home

使用STT(SQL Table Toolkit)的带TabControl的TreeView菜单

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.52/5 (6投票s)

2015年3月23日

CPOL

4分钟阅读

viewsIcon

17042

downloadIcon

84

使用 STT 轻松快速地集成 TreeView 菜单,支持权限管理,并在 TabControl 中打开窗体。

引言

在我们之前的文章中,我们介绍了 STT DLL 库的基础知识以及如何使用登录模块。

现在我们将看到如何使用 STT 的 TreeView 和 TabControl 菜单。请至少快速浏览一下之前的文章,以便能够理解本文。我们将继续我们之前在“登录模块”文章中停止的演示应用程序。

我们的目标是拥有一个 treeview 菜单,它可以在 tabcontrol 中打开我们想要的窗体,并在其中进行操作。

 

上图展示了它在大应用程序中的实现效果。左侧显示菜单,右侧显示两个打开的窗体。TabControls 上的按钮可以关闭每个选项卡。我们可以在选项卡之间切换,甚至可以将它们从主应用程序中分离出来。所有功能将在文章末尾列出。

背景

在我们的 ERP 应用程序开始时,我们使用 MenuStrip 作为我们的主应用程序菜单。随着应用程序的增长,它变得越来越复杂和混乱。更好的解决方案是使用 treeview,这使得应用程序的工作更加容易。每个人都能更好地了解所有功能,小图标也让它看起来更好。用户的反馈非常棒 :) 即使是菜单权限的实现也比 MenuStrip 更容易管理。

使用代码

我们将继续使用我们从 使用 STT (SQL 表工具包) 的登录模块 来的演示应用程序。

我们留下了一个非常丑陋的 `MainForm` 的演示应用程序。

为了实现我们的 TreeView,我们将删除这些按钮并添加

  • 一个 ImageList (命名为 `ilMenu`)
  • 一个 TreeView (命名为 `tvMenu`,将其 Dock 设置为 Left,并将 `ilMenu` 设置为 TreeView 的 ImageList)
  • 一个 Splitter (命名为 `spMenu`,将其宽度设置为 8)
  • 一个 TabControl (命名为 `tcMenu`,将其 Dock 设置为 Fill,并将 `ilMenu` 设置为 TabControl 的 ImageList,并删除其中的默认选项卡)

现在我们将向 `tvMenu` 添加一个名为 Table1 的节点。

在 MainForm 的初始化代码中,我们将添加以下内容:

Permission.LoadMenuPermissions(tvMenu, tcMenu);

这就是让 treeview 菜单工作的全部内容。

要打开我们的 `Form1`(其中包含我们的 `Table1`),我们需要在 tvMenu 的 `NodeMouseDoubleClick` 事件中添加以下代码:

        private void tvMenu_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {

            switch (e.Node.Name)
            {
                case "Table1":
                    Permission.OpenForm(tcMenu, e.Node, new Form1());
                    break;
            }

        }

就这些!

MainForm 的全部代码是:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using STT;

namespace STTDemoProject
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();

            Permission.LoadMenuPermissions(tvMenu, tcMenu);

        }

        private void tvMenu_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {

            switch (e.Node.Name)
            {
                case "Table1":
                    Permission.OpenForm(tcMenu, e.Node, new Form1());
                    break;
            }

        }
    }
}

如果我们双击选项卡控件上的 treeview 节点“Table1”,则会打开 Form1。如果我们右键单击 Table1 节点,我们可以通过上下文菜单打开 treeview 用户权限。

打开菜单权限,我们可以设置哪个权限组可以看到或打开菜单中的内容。

通过右键单击选项卡控件的选项卡,我们将看到一个选项卡上下文菜单,其中包含一些我们可以执行的操作。

我们可以通过此上下文菜单或双击选项卡来分离选项卡。

一个选项卡不能打开多次(除非它被分离)。如果打开了多个不同的选项卡,并且我们尝试打开一个已经打开的选项卡,则应用程序会将焦点设置到我们尝试打开的选项卡上。

现在我们知道了如何使用该模块,我已将图像列表 ilMenu 和一些图标添加到我们的演示应用程序中,并向 treeview 添加了更多节点。 `MenuForm` 的全部代码现在看起来像这样:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using STT;

namespace STTDemoProject
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();

            Permission.LoadMenuPermissions(tvMenu, tcMenu);

        }

        private void tvMenu_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {

            switch (e.Node.Name)
            {
                case "Table1":
                    Permission.OpenForm(tcMenu, e.Node, new Form1());
                    break;

                case "Users":
                    Permission.OpenForm(tcMenu, e.Node, new UsersForm());
                    break;

                case "Permissions":
                    Permission.OpenForm(tcMenu, e.Node, new PermissionsForm());
                    break;
            }

        }
    }
}

该演示应用程序现在拥有一个看起来像真实菜单的菜单。

 

我们可以通过此代码在选项卡控件中打开一个窗体,而无需使用 treeview:

 Permission.OpenForm(tcMain, tvMenu.Nodes["MainMenu"].Nodes["Info"], new InfoForm());

这是我们应用程序的一个示例。 `treenode` 的值也可以设置为 `null`。

特点

  • 我们只需要 4 个控件即可使其正常工作(不包括 splitter 和 image list,只有 2 个)。
  • 上下文菜单是自动添加的。
  • 权限是自动加载的。
  • 所有选项卡都有一个小关闭按钮。
  • 因为我们通过节点名称分隔节点,所以它们的位置(子节点或非子节点)并不重要。
  • TreeView 的图标也在 TabControl 中使用。
  • TreeView 的名称在 TabControl 中使用。
  • 可以通过上下文菜单或双击进行分离。
  • 我们可以通过上下文菜单一次关闭所有选项卡。
  • 我们可以关闭除所选选项卡之外的所有选项卡。

关注点

我使用 Visual Studio 的 TreeNode 编辑器向 treeview 添加节点。它们也可以通过代码添加,但何必浪费时间 ;) 也许对于灵活的菜单可能有用,但目前我们不需要。

在大型菜单中,case 循环可能会非常混乱,但目前它是需要最少代码即可工作的解决方案。如果存在更有效的方法,请告知我。

在接下来的文章中,我们将看到如何使用多语言模块,之后我们将专注于 STT 表(绑定控件、过滤、获取数据等...)。

历史

2015 年 3 月 23 日 - 首次发布。

© . All rights reserved.