[WinForm]WinForm之简易权限管理

原创 2014年06月20日 08:41:15

   [摘要]陆续在今年写了固定资产和低值易耗品,采购模具管理以及将要进行的制程管理等子系统,都是各自写一个小程序,每次都要搭建下环境。每做一个小系统部署的时候都得打包一次。干脆做一个简易框架去实现吧。

权限管理仿照自己协同工作平台。

表一:菜单管理

CREATE TABLE [dbo].[WinForm_MenuInfo](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[NAME] [nvarchar](100) NOT NULL,
	[PARENTID] [int] NOT NULL,
	[FORMNAME] [nvarchar](200) NULL,
	[TYPE] [int] NULL,
	[SORTINDEX] [int] NULL,
 CONSTRAINT [PK_WinForm_MenuInfo] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[WinForm_MenuInfo] ADD  CONSTRAINT [DF_WinForm_MenuInfo_PARENTID]  DEFAULT ((-1)) FOR [PARENTID]
GO

ALTER TABLE [dbo].[WinForm_MenuInfo] ADD  CONSTRAINT [DF_WinForm_MenuInfo_TYPE]  DEFAULT ((0)) FOR [TYPE]
GO

ALTER TABLE [dbo].[WinForm_MenuInfo] ADD  CONSTRAINT [DF_WinForm_MenuInfo_SORTINDEX]  DEFAULT ((0)) FOR [SORTINDEX]
GO

表二:角色管理

CREATE TABLE [dbo].[WinForm_RoleInfo](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[NAME] [nvarchar](100) NOT NULL,
	[DESCRIPT] [nvarchar](500) NULL,
	[PARENTID] [int] NOT NULL,
 CONSTRAINT [PK_WinForm_RoleInfo] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

表三:角色菜单

CREATE TABLE [dbo].[WinForm_RoleMenu](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[rid] [int] NOT NULL,
	[mid] [int] NOT NULL,
 CONSTRAINT [PK_WinForm_RoleMenu] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

菜单管理:


角色授权:


用户角色管理


重点来了:

WINFORM如何加载呢?

简易布局:

顶部标题

左边是树形菜单

右边是TabContorl。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ERPSystem.DBUtility;

namespace ERPSystem
{
    public partial class FrmMain : Form
    {
        public int userid;
        public FrmMain(int userid)
        {
            InitializeComponent();
            this.userid = userid;
        }

        private void FrmMain_Load(object sender, EventArgs e)
        {
            this.Icon = Icon.FromHandle(new Bitmap(imageList1.Images[2]).GetHicon());
            //清空控件
            //this.MainTabControl.TabPages.Clear();
            //绘制的方式OwnerDrawFixed表示由窗体绘制大小也一样
            this.MainTabControl.DrawMode = TabDrawMode.OwnerDrawFixed;
            this.MainTabControl.Padding = new System.Drawing.Point(CLOSE_SIZE, CLOSE_SIZE);
            this.MainTabControl.DrawItem += new DrawItemEventHandler(this.MainTabControl_DrawItem);
            this.MainTabControl.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MainTabControl_MouseDown);
            BindTree();
            this.trvMeun.ExpandAll();
        }
        const int CLOSE_SIZE = 10;
        //tabPage标签图片
        Bitmap image = global::ERPSystem.Properties.Resources.Close;

        //绘制“X”号即关闭按钮
        private void MainTabControl_DrawItem(object sender, DrawItemEventArgs e)
        {
            try
            {
                Rectangle myTabRect = this.MainTabControl.GetTabRect(e.Index);

                //先添加TabPage属性   
                e.Graphics.DrawString(this.MainTabControl.TabPages[e.Index].Text, this.Font, SystemBrushes.ControlText, myTabRect.X + 2, myTabRect.Y + 2);

                //再画一个矩形框
                using (Pen p = new Pen(Color.White))
                {
                    myTabRect.Offset(myTabRect.Width - (CLOSE_SIZE + 3), 2);
                    myTabRect.Width = CLOSE_SIZE;
                    myTabRect.Height = CLOSE_SIZE;
                    e.Graphics.DrawRectangle(p, myTabRect);
                }

                //填充矩形框
                Color recColor = e.State == DrawItemState.Selected ? Color.White : Color.White;
                using (Brush b = new SolidBrush(recColor))
                {
                    e.Graphics.FillRectangle(b, myTabRect);
                }

                //画关闭符号
                using (Pen objpen = new Pen(Color.Black))
                {
                    ////=============================================
                    //自己画X
                    ////"\"线
                    //Point p1 = new Point(myTabRect.X + 3, myTabRect.Y + 3);
                    //Point p2 = new Point(myTabRect.X + myTabRect.Width - 3, myTabRect.Y + myTabRect.Height - 3);
                    //e.Graphics.DrawLine(objpen, p1, p2);
                    ////"/"线
                    //Point p3 = new Point(myTabRect.X + 3, myTabRect.Y + myTabRect.Height - 3);
                    //Point p4 = new Point(myTabRect.X + myTabRect.Width - 3, myTabRect.Y + 3);
                    //e.Graphics.DrawLine(objpen, p3, p4);

                    ////=============================================
                    //使用图片
                    Bitmap bt = new Bitmap(image);
                    Point p5 = new Point(myTabRect.X, 4);
                    e.Graphics.DrawImage(bt, p5);
                    //e.Graphics.DrawString(this.MainTabControl.TabPages[e.Index].Text, this.Font, objpen.Brush, p5);
                }
                e.Graphics.Dispose();
            }
            catch (Exception)
            { }
        }

        //关闭按钮功能
        private void MainTabControl_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                int x = e.X, y = e.Y;
                //计算关闭区域   
                Rectangle myTabRect = this.MainTabControl.GetTabRect(this.MainTabControl.SelectedIndex);

                myTabRect.Offset(myTabRect.Width - (CLOSE_SIZE + 3), 2);
                myTabRect.Width = CLOSE_SIZE;
                myTabRect.Height = CLOSE_SIZE;

                //如果鼠标在区域内就关闭选项卡   
                bool isClose = x > myTabRect.X && x < myTabRect.Right && y > myTabRect.Y && y < myTabRect.Bottom;
                if (isClose == true)
                {
                    this.MainTabControl.TabPages.Remove(this.MainTabControl.SelectedTab);
                }
            }
        }
        /// <summary>
        /// 初始化树形菜单
        /// </summary>
        private void BindTree()
        {
            //自定义菜单表,可以从XML或者数据库读取
            /*
            DataTable tblDatas = new DataTable("Datas");
            tblDatas.Columns.Add("ID", Type.GetType("System.Int32"));
            tblDatas.Columns.Add("Title", Type.GetType("System.String"));
            tblDatas.Columns.Add("Name", Type.GetType("System.String"));
            tblDatas.Columns.Add("ParentID", Type.GetType("System.Int32"));

            tblDatas.Rows.Add(new object[] { 1, "系统管理","" ,0 });
            tblDatas.Rows.Add(new object[] { 2, "电子制程管理","", 0 });
            tblDatas.Rows.Add(new object[] { 3, "菜单管理","Form1" ,1 });
            tblDatas.Rows.Add(new object[] { 4, "角色管理", "Form2",1 });
            tblDatas.Rows.Add(new object[] { 5, "用户授权", "Form2", 1 });
            */
           
            string strRid = "select WF_RoleId from users where id=" + userid;
            string rid = string.Empty;
            using (SqlDataReader dr = SqlHelper.ExecuteReader(SqlHelper.conn, CommandType.Text, strRid))
            {
                if (dr.Read())
                {
                    rid = dr["WF_RoleId"].ToString();
                }

            }
            string strSql = "select * from dbo.WinForm_MenuInfo where ID in (select distinct mid from WinForm_RoleMenu where rid in(" + rid + ")) order by SORTINDEX ASC";
            DataTable tblDatas = SqlHelper.ExecuteDataset(SqlHelper.conn, CommandType.Text, strSql).Tables[0];
        

            initParent(tblDatas);

        }

        //初始化根节点
        private void initParent(DataTable dt)
        {
            DataRow[] drs = dt.Select("PARENTID=-1");
            foreach (DataRow dr in drs)
            {
                TreeNode tn = new TreeNode();
                tn.Text = dr["NAME"].ToString();
                tn.ToolTipText = dr["FORMNAME"].ToString();
                tn.Tag = dr["ID"].ToString();
                //tn.ImageIndex = 1;

                this.trvMeun.Nodes.Add(tn);
                //初始化下级节点
                initLeaf(dt, tn);
            }
        }
        //初始化下级节点
        private void initLeaf(DataTable dt, TreeNode tn)
        {
            DataRow[] drs = dt.Select("PARENTID=" + tn.Tag as string);
            foreach (DataRow dr in drs)
            {
                TreeNode ctn = new TreeNode();
                ctn.Text = dr["NAME"].ToString();
                ctn.ToolTipText = dr["FORMNAME"].ToString();
                ctn.Tag = dr["ID"].ToString();
               // tn.ImageIndex = 1;
                tn.Nodes.Add(ctn);

                //递归调用,不断循环至叶节点
                initLeaf(dt, ctn);
            }
        }
        //双击关闭Tab
        private void MainTabControl_DoubleClick(object sender, EventArgs e)
        {


            //Point pt = new Point(e.X, e.Y);
            if (MainTabControl.TabCount > 0)
            {
                if (MainTabControl.TabCount > 0)
                {
                    this.MainTabControl.TabPages.Remove(MainTabControl.SelectedTab);
                }
            }

        }
        /// <summary>
        /// 双击节点打开窗体
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void trvMeun_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            TreeNode node = e.Node;

            if (trvMeun.SelectedNode.Parent == null)
            {

            }
            else
            {
                if (!FindTabControl(node.Text.Trim()))
                {
                    ERPSystem.ModuleClass myfrm = new ModuleClass();
                    if (myfrm.Show_Form(node.Text.Trim(),node.ToolTipText.ToString().Trim()) != null)
                    {
                        this.MainTabControl.TabPages.Add(myfrm.Show_Form(node.Text.Trim(), node.ToolTipText.ToString().Trim()));
                        this.MainTabControl.SelectedIndex = this.MainTabControl.TabPages.Count - 1;

                    }
                    else
                    {
                       // MessageBox.Show("还在建设中...!", "ERROR");
                    }

                }
            }



        }
        /// <summary>
        /// 查询选项卡集合中是否存在同名选项卡
        /// </summary>
        private bool FindTabControl(string tabName)
        {
            bool flag = false;
            foreach (TabPage item in MainTabControl.TabPages)
            {
                if (item.Text == tabName)
                {
                    flag = true;
                }
            }

            return flag;

        }

    }
}

ModuleClass.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.Runtime.Remoting;
namespace ERPSystem
{
    class ModuleClass
    {
        public TabPage Show_Form(string FormTitle,string FormName)
        {
            string strNameSpace = "ERPSystem";
            if (FormName != "")
            {

                ObjectHandle obj = Activator.CreateInstance(null, strNameSpace + "." + FormName);
                //obj.Unwrap返回被包装的对象
                Form frm = (Form)obj.Unwrap();
                return initFrom(frm, FormTitle);
            }
            else 
            {
                return null;
            }
            /*
            switch (FormTitle)
            {
                case "菜单管理":
                    string formname = "Form1";
                case "数据库磁盘使用情况":
                    ERPSystem.Form1 frm2 = new ERPSystem.Form1();
                    return initFrom(frm2, FormTitle);
                case "IO情况":
                    ERPSystem.Form1 frm3 = new ERPSystem.Form1();
                    return initFrom(frm3, FormTitle);
                case "作业状态":
                    ERPSystem.Form1 frm4 = new ERPSystem.Form1();
                    return initFrom(frm4, FormTitle);

                case "内存使用情况":
                    ERPSystem.Form1 frm5 = new ERPSystem.Form1();
                    return initFrom(frm5, FormTitle);
             
                default:
                    return null;

            }
            */
        }
        /// <summary>
        /// 表单动态加载到页签
        /// </summary>
        /// <param name="frm"></param>
        /// <param name="Name"></param>
        /// <returns></returns>
        private TabPage initFrom(Form frm, String Name)
        {
            if (!string.IsNullOrEmpty(Name))
            {
                frm.Text = Name;
                frm.TopLevel = false;
                TabPage tp = new TabPage(Name);
                frm.FormBorderStyle = FormBorderStyle.None;
                tp.Controls.Add(frm);
                frm.Dock = DockStyle.Fill;
                frm.Show();
                return tp;
            }
            else
            {
                return null;
            }

        }
    }
}

测试:







版权声明:本文为博主原创文章,未经博主允许不得转载。

《CS框架权限管理功能设计》 winform1

  • 2015年11月28日 15:44
  • 49.3MB
  • 下载

简单的WinForm权限设计

 简单的WinForm权限设计 收藏一个简单的WinForm权限设计    最近帮助朋友写了个小软件,涉及到不同用户的不同权限设计问题.因为看到很多朋友问如何在WinForm下做权限设置,所以将代码贴...
  • Joetao
  • Joetao
  • 2009年05月26日 08:44
  • 6051

权限管理系统(web版+winform版)

  • 2009年09月03日 12:05
  • 1.66MB
  • 下载

基于winform下ef开发的权限管理系统

  • 2016年07月28日 14:07
  • 213KB
  • 下载

Winform开发框架之权限管理系统

在前一篇随笔《Winform开发框架之字典数据管理》中介绍过我Winform开发框架的总体情况,其中最重要的思路就是把常用的模块封装成控件进行重复使用,一则可以避免重复开发,提高开发效率;二则可以使用...
  • sgear
  • sgear
  • 2011年05月19日 15:54
  • 4602

C#权限管理系统源代码

  • 2014年08月28日 18:00
  • 2.5MB
  • 下载

winform通用权限开发框架示例

  • 2016年12月17日 09:52
  • 1.98MB
  • 下载

权限管理系统(web版+winform版)(c#+vs2005)

  • 2013年05月04日 21:31
  • 1.67MB
  • 下载

C# winform 权限控制 包括角色 用户 权限设置

  • 2014年10月31日 19:50
  • 2.17MB
  • 下载

在Winform程序中设置管理员权限及为用户组添加写入权限

在我们一些Winform程序中,往往需要具有一些特殊的权限才能操作系统文件,我们可以设置运行程序具有管理员权限或者设置运行程序的目录具有写入的权限,如果是在操作系统里面,我们可以设置运行程序以管理员身...
  • qq_17486399
  • qq_17486399
  • 2016年07月06日 21:06
  • 1364
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[WinForm]WinForm之简易权限管理
举报原因:
原因补充:

(最多只允许输入30个字)