• WinForm窗体权限控制的简单实现


    一.建立两张表

    //存放要控制的窗体控件

    CREATE TABLE [dbo].[AuthControl] (
    [Id] INT IDENTITY (1, 1) NOT NULL,
    [NiceName] VARCHAR (200) NULL,
    [FormFullName] VARCHAR (200) NOT NULL,
    [ControlName] VARCHAR (200) NOT NULL
    );

    //存放用户的控件控制状态

    CREATE TABLE [dbo].[AuthUser] (
    [Id] INT IDENTITY (1, 1) NOT NULL,
    [AuthControlID] INT NOT NULL,
    [UserName] VARCHAR (50) NOT NULL,
    [IsEnable] BIT NOT NULL,
    [IsVisible] BIT NOT NULL
    );

     二.写个方法.并把方法放到From_Load中,

    代码里传入的参数是要控制的窗体和一个自定义的类,是提供用户名和数据访问的,可替换为其它类

    功能:

    从表中取出窗体和用户数据.

    在窗体的控件和菜单上循环匹配取出的数据有无要控制的控件,并按用户设置进行设定

            public static void AuthUserControl(System.Windows.Forms.Form form, HRBase.UserRight login)
            {
                HRBase.UserRight.DataBaseOperate DB = (HRBase.UserRight.DataBaseOperate)login.NewDataBase("wsprint", "WERP", HRBase.UserRight.DataBaseOperate.Debug.Formal);
                string cmd = $@"select * 
                                from AuthControl a 
                                left join AuthUser b on a.id = b.AuthControlID 
                                where a.FormFullName = '{(form.GetType().FullName)}'";
                DataTable dt = DB.SelectToTable(cmd);
                //有行时才控制
                foreach (DataRow row in dt.Rows)
                {
                    //Control控制
                    try
                    {
                        if (form.Controls.Find(row["ControlName"].ToString(), true).Length > 0)
                        {
                            //默认可视不可用
                            form.Controls.Find(row["ControlName"].ToString(), true)[0].Enabled =  false;
                            form.Controls.Find(row["ControlName"].ToString(), true)[0].Visible = true;
                            //设定用户设置
                            DataRow[] dtrow = dt.Select($@"FormFullName = '{(form.GetType().FullName)}' and ControlName = '{(row["ControlName"].ToString())}' and UserName = '{(login.UserId)}'");
                            if(dtrow.Count() > 0)
                            {
                                form.Controls.Find(dtrow[0]["ControlName"].ToString(), true)[0].Enabled = (bool)(dtrow[0]["IsEnable"] ?? false);
                                form.Controls.Find(dtrow[0]["ControlName"].ToString(), true)[0].Visible = (bool)(dtrow[0]["IsVisible"] ?? true);
    
                            }
                        }
                    }
                    catch { }
                    //菜单控制
                    try
                    {
                        if (form.MainMenuStrip.Items.Find(row["ControlName"].ToString(), true).Length > 0)
                        {
                            //默认可视不可用
                            form.MainMenuStrip.Items.Find(row["ControlName"].ToString(), true)[0].Enabled =  false;
                            form.MainMenuStrip.Items.Find(row["ControlName"].ToString(), true)[0].Visible = true;
                            //设定用户设置
                            DataRow[] dtrow = dt.Select($@"FormFullName = '{(form.GetType().FullName)}' and ControlName = '{(row["ControlName"].ToString())}' and UserName = '{(login.UserId)}'");
                            if (dtrow.Count() > 0)
                            {
                                form.MainMenuStrip.Items.Find(dtrow[0]["ControlName"].ToString(), true)[0].Enabled = (bool)(dtrow[0]["IsEnable"] ?? false);
                                form.MainMenuStrip.Items.Find(dtrow[0]["ControlName"].ToString(), true)[0].Visible = (bool)(dtrow[0]["IsVisible"] ?? true);
    
                            }
    
                        }
                    }
                    catch { }
                }
            }

    三.写个窗体用来保存权限数据

    以下可选做

    四,可以在通过反射namespace,获取窗体名和窗体的控件名

        public partial class SelectAuthControlForm : Form
        {
            DataTable dt1=new DataTable(), dt2 = new DataTable();
            /// <summary>
            /// 选择的窗体FullName
            /// </summary>
            /// <value>The full name of the select form.</value>
            public string SelectFormFullName { get;private set; }
            /// <summary>
            /// 选择的窗体上的控件Name
            /// </summary>
            /// <value>The name of the select control.</value>
            public string SelectControlName { get;private set; }
    
            public SelectAuthControlForm()
            {
                InitializeComponent();
                dt1.Columns.Add("Text");
                dt1.Columns.Add("FullName");
                dt2.Columns.Add("Text");
                dt2.Columns.Add("Name");
            }
    
            private void SelectAuthControlForm_Load(object sender, EventArgs e)
            {
                this.Cursor = Cursors.WaitCursor;
                this.Show();
                dataGridView1.AddColumn("Text", "窗体标题");
                dataGridView1.AddColumn("FullName", "窗体类名");
                dataGridView2.AddColumn("Text", "控件文本");
                dataGridView2.AddColumn("Name", "控件类名");
                Application.DoEvents();
                var classes = Assembly.Load("erp").GetTypes();
                foreach (var item in classes)
                {
                    if ((item.BaseType != null ? item.BaseType.Name : "") == "Form")
                    {
                        try
                        {
                            var obj = Assembly.Load("erp").CreateInstance(item.FullName);
                            PropertyInfo propertyText = obj.GetType().GetProperty("Text"); //获取指定名称的属性
                            string valueText = propertyText.GetValue(obj, null).ToString(); //获取属性值
                            DataRow row = dt1.Rows.Add(valueText, item.FullName);
                        }
                        catch (Exception ex)
                        {
                            //MessageBox.Show(ex.Message);
                        }
                    }
                }
                dataGridView1.SetDataSource(dt1);
    
                this.Cursor = Cursors.Arrow;
                Application.DoEvents();
            }
            private void AddTabControl(TabPage page)
            {
                foreach (Control con in page.Controls)
                {
                    Type type = con.GetType();
                    string str1 = con.GetType().GetProperty("Text").GetValue(con, null).ToString();
                    string strname1 = con.GetType().GetProperty("Name").GetValue(con, null).ToString();
                    if (((Control)con).Controls.Count > 0)
                    {
                        AddControlInList(type.FullName);
                    }
                    else
                    {
                        PropertyInfo propertyText = con.GetType().GetProperty("Text"); //获取指定名称的属性
                        string valueText = propertyText.GetValue(con, null).ToString(); //获取属性值
                        PropertyInfo propertyName = con.GetType().GetProperty("Name"); //获取指定名称的属性
                        string valueName = propertyName.GetValue(con, null).ToString(); //获取属性值
                        dt2.Rows.Add(con.Text, con.Name);
                    }
    
                }
            }
            private void AddControlInList(string fullName)
            {
                var obj = Assembly.Load("erp").CreateInstance(fullName);
                if (obj == null) return;
                foreach (Control con in ((Control)obj).Controls)
                {
                    Type type = con.GetType();
                    if(type.FullName == "System.Windows.Forms.TabControl")
                    {
                        foreach(TabPage page in ((TabControl)con).TabPages)
                        {
                            AddTabControl(page);
                        }
                    }
                    switch (type.BaseType.Name)
                    {
                        case "ToolStrip":
                            string str = con.GetType().GetProperty("Text").GetValue(con, null).ToString();
                            string strname = con.GetType().GetProperty("Name").GetValue(con, null).ToString();
                            if (((ToolStrip)con).Items.Count > 0)
                                AddMenuInList((ToolStrip)con);
                            else
                            {
                                dt2.Rows.Add(con.Text, con.Name);
                            }
                            break;
                        default:
                            string str1 = con.GetType().GetProperty("Text").GetValue(con, null).ToString();
                            string strname1 = con.GetType().GetProperty("Name").GetValue(con, null).ToString();
                            if (((Control)con).Controls.Count > 0)
                            {
                                AddControlInList(type.FullName);
                            }
                            else
                            {
                                PropertyInfo propertyText = con.GetType().GetProperty("Text"); //获取指定名称的属性
                                string valueText = propertyText.GetValue(con, null).ToString(); //获取属性值
                                PropertyInfo propertyName = con.GetType().GetProperty("Name"); //获取指定名称的属性
                                string valueName = propertyName.GetValue(con, null).ToString(); //获取属性值
                                dt2.Rows.Add(con.Text, con.Name);
                            }
    
                            break;
                    }
                }
    
            }
    
            private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
            {
                dt2.Rows.Clear();
                if (e.RowIndex > -1)
                {
                    string fillName = dataGridView1["FullName", e.RowIndex].Value.ToString();
                    this.Cursor = Cursors.WaitCursor;
                    AddControlInList(fillName);
                    dataGridView2.SetDataSource(dt2);
                    this.Cursor = Cursors.Arrow;
                }
            }
    
            private void toolStripButton1_Click(object sender, EventArgs e)
            {
                if (dataGridView1.CurrentRow != null && dataGridView2.CurrentRow != null)
                {
                    this.DialogResult = DialogResult.OK;
                    SelectFormFullName = dataGridView1["FullName", dataGridView1.CurrentRow.Index].Value.ToString();
                    SelectControlName = dataGridView2["Name", dataGridView2.CurrentRow.Index].Value.ToString();
                }
                else
                {
                    MessageBox.Show("没有选择有效的控件!!!");
                }
            }
    
            private void AddMenuInList(object obj)
            {
                ToolStrip ts = obj as ToolStrip;
                if (ts != null)
                {
                    foreach (object con in ts.Items)
                    {
                        ToolStripDropDown tdd = con as ToolStripDropDown;
                        if (tdd != null)
                        {
                            dt2.Rows.Add(tdd.Text , tdd.Name);
                            if (tdd.Items.Count > 0)
                                AddMenuInList(tdd);
                        }
                        ToolStripMenuItem tsm = con as ToolStripMenuItem;
                        if (tsm != null)
                        {
                            dt2.Rows.Add(tsm.Text , tsm.Name);
    
                            if (tsm.DropDownItems.Count > 0)
                                AddMenuInList(tsm);
                        }
                    }
                }
                ToolStripMenuItem ts1 = obj as ToolStripMenuItem;
                if (ts1 != null)
                {
                    foreach (object con in ts1.DropDownItems)
                    {
                        ToolStripDropDown tdd = con as ToolStripDropDown;
                        if (tdd != null)
                        {
                            dt2.Rows.Add(tdd.Text, tdd.Name);
    
                            if (tdd.Items.Count > 0)
                                AddMenuInList(tdd);
                        }
                        ToolStripMenuItem tsm = con as ToolStripMenuItem;
                        if (tsm != null)
                        {
                            dt2.Rows.Add(tsm.Text, tsm.Name);
    
                            if (tsm.DropDownItems.Count > 0)
                                AddMenuInList(tsm);
                        }
                    }
                }
            }
    
    
        }

    五.写个窗体选择用户

    六,可扩展用户角色,更灵活.

  • 相关阅读:
    微服务基础——厉害了!API网关
    11.11 大促背后的秘密——智能合图
    那些我们对2019技术世界趋势的预测都说准了吗?
    DevOps云翼日志服务实践
    技术沙龙|原来落地AI应用是这么回事儿!
    直击JDD | 京东开启技术服务元年:携手合作伙伴,共创产业未来
    直击JDD | 徐雷:智能化零售,以技术为驱动力的突破路径
    直击JDD | 陈生强:京东数科的底层是数字化操作系统
    干货 | Spark Streaming 和 Flink 详细对比
    持续集成与自动化部署
  • 原文地址:https://www.cnblogs.com/zhiming99/p/7363473.html
Copyright © 2020-2023  润新知