关于winform窗口运用程序实现treeview和tabControl的动态显示
这个示例中菜单使用控件treeview,数据是动态加载的。右边的标签页用的tabControl,通过改变tabpag实现切换效果。
之前网上找了很多方法,由于我的form是动态加载的。一直没法获取,最后在窗口中先初始化。再把form对象放到对象集合再遍历集合,通过form的name属性和treeview的text属性进行对比动态展示标签页。
先做一个菜单列表:
ps:我用的是splitContainer控件做的布局
下面展示一些 内联代码片
。
在这里插入图片描述
//将form子窗口加载到对象集合
在这里插入图片描述
private UserInfo users;
private Fxglinter fxgl;
private ybfx ybfx;
private htgl htgl;
private ywcl ywcl;
private zhcx zhcx;
private int num;
List<Object> tblis;
public FXGL_Main(UserInfo user)
{
ybfx = new ybfx();
htgl = new htgl();
ywcl = new ywcl();
zhcx = new zhcx();
fxgl = new Fxglinter();
tblis = new List<Object>();
tblis.Add(ybfx);
tblis.Add(htgl);
tblis.Add(ywcl);
tblis.Add(zhcx);
tblis.Add(fxgl);
}
//窗口加载的时候动态加载菜单
private void FXGL_Main_Load(object sender, EventArgs e)
{
this.treeView1.BeginUpdate();
this.treeView1.Nodes.Clear();
//读取数据动态加载菜单,for循环递归子菜单
List<string> lists=fxgl.getMenu();
for (int i = 0; i < lists.Count(); i++)
{
TreeNode topNode = new TreeNode(lists[i], 0, 0);
this.treeView1.Nodes.Add(topNode);
List<string> mune_childen = fxgl.getMenu_Children(lists[i]);
foreach (string menu in mune_childen)
{
TreeNode subNode = new TreeNode(menu, 1, 1);
subNode.Tag = menu;
topNode.Nodes.Add(subNode);
}
}
//treeView1.Nodes[0].Expand();
//this.treeView1.ExpandAll();
this.treeView1.EndUpdate();
Up_TreeViewImg();
}
//初始化&修改菜单样式
private void Up_TreeViewImg()
{
//节点选中/和未选中的图片,图片放到了程序根目录下
string path1 = Application.StartupPath + "\\imager\\file.png";
string path2 = Application.StartupPath + "\\imager\\fileopen.png";
ImageList myImageList = new ImageList();
myImageList.Images.Add(Image.FromFile(path1));
myImageList.Images.Add(Image.FromFile(path2));
treeView1.ImageList = myImageList;
int num = treeView1.Nodes.Count;
for (int i = 0; i < treeView1.Nodes.Count;i++ )
{
treeView1.Nodes[i].ImageIndex = 0;
treeView1.Nodes[i].SelectedImageIndex = 1;
for (int j = 0; j < treeView1.Nodes.Count; j++)
{
treeView1.Nodes[i].Nodes[j].ImageIndex = 0;
treeView1.Nodes[i].Nodes[j].SelectedImageIndex = 1;
}
}
}
当菜单被选中之后的事件:
/*
* 菜单被选择后加载事件
* */
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
Up_TreeViewImg();
string tvname= e.Node.Text;
//获取菜单的类型,菜单在数据库如:合同管理 对应menu_py :htgl
List<string> showlis = fxgl.getMenu_PY(e.Node.Text);
List<string> lis = new List<string>();
for (int i = 0; i < tabControl1.TabCount; i++)
{
string tbname = tabControl1.TabPages[i].Text;
lis.Add(tbname);
}
//判断是否存在标签,不存在就创建
if (lis.IndexOf(tvname, 0, lis.Count) < 0)
{
TabPage tabpage = new System.Windows.Forms.TabPage();
tabpage.Name = tvname;
tabpage.AutoScroll = true;
tabpage.Text = tvname;
//判断选中的菜单是否存在form 存在打开对应标签页
foreach (string mune in showlis)
{
for (int i = 0; i < tblis.Count;i++ )
{
//截取对象数据名称如:htgl
int begnum =tblis[i].GetType().ToString().Length-4;
string menustype = tblis[i].GetType().ToString().Substring(begnum, 4);
if (menustype == mune)
{
//初始化一个form,根据菜单来示例form对象
Form form = (Form)tblis[i];
form.FormBorderStyle = FormBorderStyle.None;
form.Dock = DockStyle.Fill;
form.TopLevel = false;
form.Show();
form.Parent = tabpage;
tabpage.Controls.Add(form);
}
}
}
this.tabControl1.Controls.Add(tabpage);
this.tabControl1.SelectedTab = tabpage;
num = num + 1;
}
//根据选择打开标签页
TabPage tp = (TabPage)tabControl1.Controls.Find(e.Node.Text, false)[0];
this.tabControl1.SelectedTab = tp;
}
窗口完整的代码示例
using ManagerStar.DBCONE;
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;
namespace ManagerStar
{
public partial class FXGL_Main : Form
{
private UserInfo users;
private Fxglinter fxgl;
private ybfx ybfx;
private htgl htgl;
private ywcl ywcl;
private zhcx zhcx;
private int num;
List<Object> tblis;
public FXGL_Main(UserInfo user)
{
ybfx = new ybfx();
htgl = new htgl();
ywcl = new ywcl();
zhcx = new zhcx();
fxgl = new Fxglinter();
tblis = new List<Object>();
tblis.Add(ybfx);
tblis.Add(htgl);
tblis.Add(ywcl);
tblis.Add(zhcx);
tblis.Add(fxgl);
InitializeComponent();
users = user;
}
private void splitContainer1_Panel2_Paint(object sender, PaintEventArgs e)
{
}
private void splitContainer1_Panel1_Paint(object sender, PaintEventArgs e)
{
}
private void FXGL_Main_Load(object sender, EventArgs e)
{
//string path = Application.StartupPath + "\\imager\\heard.jpg";
string path = users.gethHear_url();
label1.Text = "您好" + users.getUs_name() + ":" + users.getUsername();
label2.Text = "上次登录:" + users.getLogin_time();
// Image image = new Bitmap(path);
//pictureBox1.BackgroundImage = image;
// pictureBox1.BackgroundImageLayout = ImageLayout.Stretch;
this.treeView1.BeginUpdate();
this.treeView1.Nodes.Clear();
//读取数据动态加载菜单
List<string> lists=fxgl.getMenu();
for (int i = 0; i < lists.Count(); i++)
{
TreeNode topNode = new TreeNode(lists[i], 0, 0);
this.treeView1.Nodes.Add(topNode);
List<string> mune_childen = fxgl.getMenu_Children(lists[i]);
foreach (string menu in mune_childen)
{
TreeNode subNode = new TreeNode(menu, 1, 1);
subNode.Tag = menu;
topNode.Nodes.Add(subNode);
}
}
//treeView1.Nodes[0].Expand();
//this.treeView1.ExpandAll();
this.treeView1.EndUpdate();
Up_TreeViewImg();
}
//初始化&修改菜单样式
private void Up_TreeViewImg()
{
//节点选中/和未选中的图片,图片放到了程序根目录下
string path1 = Application.StartupPath + "\\imager\\file.png";
string path2 = Application.StartupPath + "\\imager\\fileopen.png";
ImageList myImageList = new ImageList();
myImageList.Images.Add(Image.FromFile(path1));
myImageList.Images.Add(Image.FromFile(path2));
treeView1.ImageList = myImageList;
int num = treeView1.Nodes.Count;
for (int i = 0; i < treeView1.Nodes.Count;i++ )
{
treeView1.Nodes[i].ImageIndex = 0;
treeView1.Nodes[i].SelectedImageIndex = 1;
for (int j = 0; j < treeView1.Nodes.Count; j++)
{
treeView1.Nodes[i].Nodes[j].ImageIndex = 0;
treeView1.Nodes[i].Nodes[j].SelectedImageIndex = 1;
}
}
}
/*
* 菜单被选择后加载事件
* */
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
Up_TreeViewImg();
string tvname= e.Node.Text;
//获取菜单的类型,菜单在数据库如:合同管理 对应menu_py :htgl
List<string> showlis = fxgl.getMenu_PY(e.Node.Text);
List<string> lis = new List<string>();
for (int i = 0; i < tabControl1.TabCount; i++)
{
string tbname = tabControl1.TabPages[i].Text;
lis.Add(tbname);
}
//判断是否存在标签,不存在就创建
if (lis.IndexOf(tvname, 0, lis.Count) < 0)
{
TabPage tabpage = new System.Windows.Forms.TabPage();
tabpage.Name = tvname;
tabpage.AutoScroll = true;
tabpage.Text = tvname;
//判断选中的菜单是否存在form 存在打开对应标签页
foreach (string mune in showlis)
{
for (int i = 0; i < tblis.Count;i++ )
{
//截取对象数据名称如:htgl
int begnum =tblis[i].GetType().ToString().Length-4;
string menustype = tblis[i].GetType().ToString().Substring(begnum, 4);
if (menustype == mune)
{
//初始化一个form,根据菜单来示例form对象
Form form = (Form)tblis[i];
form.FormBorderStyle = FormBorderStyle.None;
form.Dock = DockStyle.Fill;
form.TopLevel = false;
form.Show();
form.Parent = tabpage;
tabpage.Controls.Add(form);
}
}
}
this.tabControl1.Controls.Add(tabpage);
this.tabControl1.SelectedTab = tabpage;
num = num + 1;
}
//根据选择打开标签页
TabPage tp = (TabPage)tabControl1.Controls.Find(e.Node.Text, false)[0];
this.tabControl1.SelectedTab = tp;
}
}
}