博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WinForm窗体权限控制的简单实现
阅读量:5145 次
发布时间:2019-06-13

本文共 11362 字,大约阅读时间需要 37 分钟。

一.建立两张表

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

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();        ///         /// 选择的窗体FullName        ///         /// 
The full name of the select form.
public string SelectFormFullName { get;private set; } /// /// 选择的窗体上的控件Name /// ///
The name of the select control.
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); } } } } }

 

五.写个窗体选择用户

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

 

转载于:https://www.cnblogs.com/zhiming99/p/7363473.html

你可能感兴趣的文章
注解小结
查看>>
list control控件的一些操作
查看>>
绝望的第四周作业
查看>>
一月流水账
查看>>
npm 常用指令
查看>>
判断字符串在字符串中
查看>>
Linux环境下Redis安装和常见问题的解决
查看>>
HashPump用法
查看>>
cuda基础
查看>>
Vue安装准备工作
查看>>
oracle 创建暂时表
查看>>
201421410014蒋佳奇
查看>>
Xcode5和ObjC新特性
查看>>
LibSVM for Python 使用
查看>>
Centos 7.0 安装Mono 3.4 和 Jexus 5.6
查看>>
CSS属性值currentColor
查看>>
java可重入锁reentrantlock
查看>>
浅谈卷积神经网络及matlab实现
查看>>
解决ajax请求cors跨域问题
查看>>
《收获,不止Oracle》pdf
查看>>