MDI窗体容器、权限设置
一、MDI窗体容器:
1、功能:
它可以让其它窗体在它的内部打开,无法超出它的范围
将某个窗体的属性:IsMdiContainer设置为true - 窗口样式
2、问题:
(1)如何将其它窗体在它的内部打开?
窗体对象名.MdiParent = this;
(2)窗体打开时最大化属性不好用,怎么办?
在实例化窗体对象,show之前,用代码设置最大化属性
注意:窗体的WindowState属性必须为默认值Normal
(3)内部窗体最大时右上角总是显示最大最小关闭按钮,如何去掉?
在MDI窗体里放置一个Panel,将Panel沾满全部窗体,然后让新开窗体在Panel内部打开
窗体对象名.Parent = Panel1;
(4)窗体最大化打开后,不会跟随MDI窗体容器的大小而改变
使用ClinetSizeChanged事件,在事件中,将全部以打开的窗体的WindowState属性重新设置一遍
二、权限设置:
1、因为不同的用户能看到的程序功能不同,那么需要权限来限制用户
2、数据库字段里面保存字符串类型的模块代码
3、在登陆成功时进行验证,看看有没有对应模块的权限代码
4、如果没有,那么需要把相应的功能按钮隐藏
三、代码
登录界面(在Program里面把登录界面设置为最先打开:Application.Run(new 登录()); )
using MDI窗体容器_权限设置.App_Code; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace MDI窗体容器_权限设置 { public partial class 登录 : Form { public 登录() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { QX qq = new QXData().Select(textBox1.Text, textBox2.Text); if(qq!=null)//两个文本框不等于空 { Form1 f=new Form1(qq); f.Show();//显示主界面 this.Hide(); } } } }
数据库中权限设置表的实体类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MDI窗体容器_权限设置.App_Code { public class QX { private string _Username; public string Username { get { return _Username; } set { _Username = value; } } private string _Pwd; public string Pwd { get { return _Pwd; } set { _Pwd = value; } } private string _Qx; public string Qx { get { return _Qx; } set { _Qx = value; } } } }
数据访问类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; namespace MDI窗体容器_权限设置.App_Code { public class QXData { SqlConnection conn = null; SqlCommand cmd = null; public QXData() { conn = new SqlConnection("server=.;database=Data0720;user=sa;pwd=123"); cmd = conn.CreateCommand(); } public QX Select(string uname, string pwd) { QX q = null; cmd.CommandText = "select * from quanxian where Username=@a and Pwd=@b"; cmd.Parameters.Clear(); cmd.Parameters.Add("@a",uname); cmd.Parameters.Add("@b", pwd); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); if (dr.HasRows) { dr.Read(); q = new QX(); q.Username = dr[0].ToString(); q.Pwd = dr[1].ToString(); q.Qx = dr[2].ToString(); } conn.Close(); return q; } } }
主界面
using MDI窗体容器_权限设置.App_Code; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace MDI窗体容器_权限设置 { public partial class Form1 : Form { QX Q = null; public Form1(QX qq) { InitializeComponent(); Q = qq; //设置权限 if (!qq.Qx.Contains("101"))//如果权限里面不包含101,那么就让销售窗体不显示 { 销售ToolStripMenuItem.Visible = false; } if (!qq.Qx.Contains("102"))//如果权限里面不包含102,那么就让仓库窗体不显示 { 仓库ToolStripMenuItem.Visible = false; } if (!qq.Qx.Contains("103"))//如果权限里面不包含103,那么就让财务窗体不显示 { 财务ToolStripMenuItem.Visible = false; } if (!qq.Qx.Contains("104"))//如果权限里面不包含104,那么就让管理窗体不显示 { 管理ToolStripMenuItem.Visible = false; } } xiaoshou x = null; private void 销售ToolStripMenuItem_Click(object sender, EventArgs e) { x = new xiaoshou(); //让xiaoshou x 的MDI父级容器为this即Form1,这样销售窗体就会显示在Form1窗体内部 x.MdiParent = this; //把销售窗体的父级指向Panel //问题:内部窗体不随着Form的拖动大小跟着变动 //办法:代码里面去掉无边框设置,在属性里面设置 // 然后设置Form1的ClientSizeChanged事件,让内部窗体的大小随着Form1的拖动而改变大小 x.Parent = panel1; //在show之前让内部的窗体显示最大化 x.WindowState = FormWindowState.Maximized; #region 无边框设置 //去掉内部窗体右上角的最大化、最小化、关闭按钮,设置无边框。 //问题:但是不好用,右上角的按钮还在,并且点击最小化之后内部窗体的大小便不会再变 //办法:那么在Form1窗体放一个Panel,填充内部,把销售窗体的父级指向Panel(操作在上面) //x.FormBorderStyle = FormBorderStyle.None; #endregion x.Show(); } cangku c = null; private void 仓库ToolStripMenuItem_Click(object sender, EventArgs e) { c = new cangku(); c.MdiParent = this; c.Parent = panel1; c.WindowState = FormWindowState.Maximized; c.Show(); } caiwu w = null; private void 财务ToolStripMenuItem_Click(object sender, EventArgs e) { w = new caiwu(); w.MdiParent = this; w.Parent = panel1; w.WindowState = FormWindowState.Maximized; w.Show(); } guanli g = null; private void 管理ToolStripMenuItem_Click(object sender, EventArgs e) { g = new guanli(); g.MdiParent = this; g.Parent = panel1; g.WindowState = FormWindowState.Maximized; g.Show(); } //点错了,应该是Form1的,在下面 private void panel1_ClientSizeChanged(object sender, EventArgs e) { } //设置内部窗体的大小 private void Form1_ClientSizeChanged(object sender, EventArgs e) { if (x != null) { x.WindowState = FormWindowState.Normal; x.WindowState = FormWindowState.Maximized; } if (c != null) { c.WindowState = FormWindowState.Normal; c.WindowState = FormWindowState.Maximized; } if (w != null) { w.WindowState = FormWindowState.Normal; w.WindowState = FormWindowState.Maximized; } if (g != null) { g.WindowState = FormWindowState.Normal; g.WindowState = FormWindowState.Maximized; } } } }