C#之Winform实现MDI导航树Treeview

1 先上效果图

treeview导航树

导航树停靠在MDI窗体的左边,可拖动改变大小,打开的窗口在【窗口】菜单下有列表。
VS2010实现这个其实很简单,走了不少弯路,我直接上最简单的方案

2 先创建一个MDIForm

窗体的 isMdiContainer = true

3 窗体上放一个MenuStrip菜单 name = menuMDI

一级菜单 输入 【开始】name = startMenu、【窗口】 name = windowsMenuItem两项
【开始】项下增加【新建】name = newMenuItem【-】、 【退出】name=exitMenuItem
【窗口】项下增加【导航树】name = treeMenuItem

4 MDIForm窗体内放置一个TreeView控件treeView1,

其中 Dock = left
靠近treeView1再放置一个Splitter控件splitter1,不用任何代码就能拖动改变treeview的宽度。

5 Treeview控件的使用百度或自己脑补

以上设置和布局基本实现导航树 功能。

6 核心代码

6.1新建测试窗体

private void newMenuItem_Click(object sender, EventArgs e)
        {
            Form f = new Form();
            ll = ll + 11;
            f.Name = ll.ToString();
            f.Text = f.Name;
            f.MdiParent = this;

            f.Show();
        }

6.2 退出程序

private void exitMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

6.3 导航树开关

private void treeMenuItem_Click(object sender, EventArgs e)
        {
            if (treeView1.Visible)
            {
                treeView1.Visible = false;
                treeMenuItem.Checked = false;
            }
            else {
                treeView1.Visible = true;
                treeMenuItem.Checked = true;
            }
        }

7 全部代码

using System;
using System.Windows.Forms;
using System.Reflection;
using AppUI.SDI;
using System.Data;
using BLL;

namespace AppUI
{
    public partial class MDIForm : Form
    {
        public MDIForm()
        {
            InitializeComponent();
        }

        //全部菜单项
        DataTable dt = null;

        private void MDIForm_Load(object sender, EventArgs e)
        {
            dt = BLLsysMemu.Select();

            //创建treeview根节点
            TreeNode tn0 = treeView1.Nodes.Add("我的导航");
            tn0.ImageIndex = 0;
            tn0.SelectedImageIndex = 0;

            //TreeNode tn1 = new TreeNode("基础数据");
            //tn1.Tag = "1000";
            //TreeNode tn2 = new TreeNode("业务数据");
            //tn2.Tag = "2000";
            //TreeNode tn3 = new TreeNode("系统管理");
            //tn3.Tag = "9000";


            //tn0.Nodes.Add(tn1);
            //tn0.Nodes.Add(tn2);
            //tn0.Nodes.Add(tn3);
            TreeNode tn1 = null;

            for (int r = 0; r < dt.Rows.Count; r++ )
            {
                string name, pid;
                pid = dt.Rows[r]["menu_id"].ToString();
                name = dt.Rows[r]["menu_name"].ToString();
                
                if (pid.Substring(1) == "000") {
                    tn1 = new TreeNode(name);
                    tn1.ImageIndex = 1;
                    tn1.SelectedImageIndex = 2;
                    tn0.Nodes.Add(tn1);
                }
                else{
                TreeNode tn2 = new TreeNode(name);
                tn2.Tag = pid;
                tn2.ImageIndex = 3;
                tn2.SelectedImageIndex = 4;
                tn1.Nodes.Add(tn2);
                }
                
            }

            treeView1.ExpandAll();
        }

        
        private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            string formName = ""; //要打开的窗体:命名空间.类名
            TreeNode tn = e.Node;

            string tag = (string)tn.Tag;                     

            if (string.IsNullOrEmpty(tag)) return;

            //if (tag == "1000") formName = "JIC";
            //else if (tag == "2000") formName = "YEW";
            //else if (tag == "9000") formName = "XIT";
            //else return;

            Assembly assembly = Assembly.GetExecutingAssembly();
            // 实例化窗体
            //formName = "AppUI.SDI." + formName;
            formName = dt.Select("menu_id = '" + tag + "'")[0]["s_form"].ToString();

            Form form = assembly.CreateInstance(formName) as Form;
            string ftext = dt.Select("menu_id = '" + tag + "'")[0]["menu_name"].ToString();
            form.Text = tag + ftext;

            ShowForm(form);
        }

        private void ShowForm(Form sdi) //在pane2里打开窗体
        {
            //this.splitContainer1.Panel2.Controls.Clear();
            
            //sdi.FormBorderStyle = FormBorderStyle.FixedDialog;
            sdi.FormBorderStyle = FormBorderStyle.None;
            sdi.FormBorderStyle = FormBorderStyle.SizableToolWindow;
            sdi.Dock = DockStyle.Fill;
            sdi.TopLevel = false;
            //sdi.Parent = this.splitContainer1.Panel2;
            //this.splitContainer1.Panel2.Controls.Add(sdi);
            sdi.BringToFront();
            sdi.Show();
        }

        private void MDIForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
        }
        long ll = 0;
        private void newMenuItem_Click(object sender, EventArgs e)
        {
            Form f = new Form();
            ll = ll + 11;
            f.Name = ll.ToString();
            f.Text = f.Name;
            f.MdiParent = this;

            f.Show();
        }

        private void treeMenuItem_Click(object sender, EventArgs e)
        {
            if (treeView1.Visible)
            {
                treeView1.Visible = false;
                treeMenuItem.Checked = false;
            }
            else {
                treeView1.Visible = true;
                treeMenuItem.Checked = true;
            }
        }

        private void exitMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}

你可能感兴趣的:(C#之Winform实现MDI导航树Treeview)