C# winform 权限设置的解决方案

题注:因为我不知道怎么命名比较合适,就随便列了个名字,后面想好再改吧,或者就这样好了也不一定。

先上一张图,主要是介绍了这种介面的做法,还可以吧,至少是自己捣弄出来的,呵呵。

图一、权限分配主界面

 

看了上面,大概猜到我要说什么了吧?就是那个单个,或多个项目的移动实现原理,至于数据库的设计,这里不准备说了,只说逻辑层的一些思路(虽然我分不太清楚数据层、逻辑层、应用层这些鬼东西,但大家能理解就好了。)

首先,先对各个控件命个名:

 1.未分配ListBox --> ltbRoleOutList
 2.已分配ListBox --> ltbRoleInList
 3. --> btnInAll
 4. --> btnInOne
 5. --> btnOutOne
 6. --> btnOutAll
 7. --> btnSave

好了,下面代码出现的东西,自己对号入座,下面进入正题

1、既然要操作,那么首先就要把它们加载出来,因为这些权限肯定要存在数据库中的,如下:

 1         /// <summary>
 2         /// 綁定已分配及未分配的用戶組
 3         /// </summary>
 4         private void BindList()
 5         {
 6             if (string.IsNullOrEmpty(oCimUserRole.userId))
 7             {
 8                 MessageBox.Show("加載出錯,請關閉本窗口","提示");
 9                 return;
10             }
11             DataSet dsOutRole = oCimUserRole.GetUserOutRoleNameList();  //加載未分配的權限
12             DataSet dsInRole = oCimUserRole.GetUserInRoleNameList();    //加載已分配的權限
13 
14             int outCount = dsOutRole.Tables[0].Rows.Count;
15             int inCount = dsInRole.Tables[0].Rows.Count;
16 
17             for (int j = 0; j < outCount; j++)
18             {
19                 ltbRoleOutList.Items.Add(dsOutRole.Tables[0].Rows[j][0].ToString());
20             }
21 
22             for (int i = 0; i < inCount; i++)
23             {
24                 ltbRoleInList.Items.Add(dsInRole.Tables[0].Rows[i][0].ToString());
25             }
26         }

2、加载完数据以后,当需要添加(即把 ltbRoleOutList的项移到ltbRoleInList那里去)、删除(跟“添加”相反,自己理解。)权限时,我们首先要获取被移动的是哪几项,那怎么知道呢?下面有两个方法,就是分别取左别和右边的被选中项目。

 1         /// <summary>
 2         /// 獲取未分配列表中的選中項
 3         /// </summary>
 4         /// <returns></returns>
 5         private List<string> GetLeftSelectedList()
 6         {
 7             List<string> items = new List<string>();
 8             int lCount = ltbRoleOutList.SelectedItems.Count;
 9             for (int i = 0; i < lCount; i++)
10             {
11                 items.Add(ltbRoleOutList.SelectedItems[i].ToString());
12             }
13 
14             return items;
15         }
16 
17         /// <summary>
18         /// 獲取已分配列表中的選中項
19         /// </summary>
20         /// <returns></returns>
21         private List<string> GetRightSelectedList()
22         {
23             List<string> items = new List<string>();
24             int lCount = ltbRoleInList.SelectedItems.Count;
25             for (int i = 0; i < lCount; i++)
26             {
27                 items.Add(ltbRoleInList.SelectedItems[i].ToString());
28             }
29 
30             return items;
31         }

以上两个方法,返回值是一个List<string>类

3、获取到选中项还不够,我们接下来要进行的动作无非就是:添加权限(右移)和删除权限(左移),所以,我们也针对此写两个方法,方便日后调用,如下:

 1         /// <summary>
 2         /// 添加權限
 3         /// </summary>
 4         private void InsertRoleName()
 5         {
 6             if (ltbRoleOutList.SelectedIndex != -1)
 7             {
 8                 List<string> items = GetLeftSelectedList();
 9 
10                 //int nCount = items.Count;
11                 if (items.Count > 0)
12                 {
13                     //for (int i = 0; i < nCount; i++)
14                     foreach (var item in items)
15                     {
16                         MoveRight(item);
17                     }
18                 }
19             }
20         }
21 
22         /// <summary>
23         /// 移除權限
24         /// </summary>
25         /// <param name="items"></param>
26         private void DeleteRoleName()
27         {
28             if (ltbRoleInList.SelectedIndex != -1)
29             {
30                 List<string> items = GetRightSelectedList();
31                 //int nCount = items.Count;
32                 if (items.Count > 0)
33                 {
34                     //for (int i = 0; i < nCount; i++)
35                     foreach (var item in items)
36                     {
37                         MoveLeft(item);
38                     }
39                 }
40             }
41         }
42 
43         /// <summary>
44         /// 向右邊插入一項
45         /// </summary>
46         /// <param name="roleName"></param>
47         private void MoveRight(string roleName)
48         {
49             ltbRoleInList.Items.Add(roleName);
50             ltbRoleOutList.Items.Remove(roleName);
51         }
52 
53         /// <summary>
54         /// 向左邊插入一項
55         /// </summary>
56         /// <param name="roleName"></param>
57         private void MoveLeft(string roleName)
58         {
59             ltbRoleOutList.Items.Add(roleName);
60             ltbRoleInList.Items.Remove(roleName);
61         }

好吧,是四个,前面两个才是主角,后面两个是被它们调用的。既然方法已经写完了,那么通过这几个方法,我们就可以进行接下来的操作了,下面我把每个按钮的动作都分开来写

4、

1         /// <summary>
2         /// 添加選中的權限
3         /// </summary>
4         /// <param name="sender"></param>
5         /// <param name="e"></param>
6         private void btnInOne_Click(object sender, EventArgs e)
7         {
8             InsertRoleName();
9         }

5、

1         /// <summary>
2         /// 移除選中的權限
3         /// </summary>
4         /// <param name="sender"></param>
5         /// <param name="e"></param>
6         private void btnOutOne_Click(object sender, EventArgs e)
7         {
8             DeleteRoleName();
9         }

6、

 1         /// <summary>
 2         /// 添加所有的權限
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void btnInAll_Click(object sender, EventArgs e)
 7         {
 8             //無非就是操作前,先把左側權限全部選中,一個遍歷搞定
 9             int lCount = ltbRoleOutList.Items.Count;
10             for (int i = 0; i < lCount; i++)
11             {
12                 ltbRoleOutList.SetSelected(i, true);
13             }
14             InsertRoleName();
15         }

7、

 1         /// <summary>
 2         /// 移除所有的權限
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void btnOutAll_Click(object sender, EventArgs e)
 7         {
 8             //同理,就是操作前,先把右側權限全部選中,一個遍歷搞定
 9             int lCount = ltbRoleInList.Items.Count;
10             for (int i = 0; i < lCount; i++)
11             {
12                 ltbRoleInList.SetSelected(i, true);
13             }
14             DeleteRoleName();
15         }

 8、当双击 ltbRoleOutList 时,会把被双击(被选中)项添加到右侧列表中:

1         /// <summary>
2         /// 雙擊添加某項權限嘛
3         /// </summary>
4         /// <param name="sender"></param>
5         /// <param name="e"></param>
6         private void ltbRoleOutList_DoubleClick(object sender, EventArgs e)
7         {
8             InsertRoleName();
9         }

 9、当双击 ltbRoleInList 时,会把被双击(被选中)项添加到左侧列表中: 

1         /// <summary>
2         /// 雙擊移除權限
3         /// </summary>
4         /// <param name="sender"></param>
5         /// <param name="e"></param>
6         private void ltbRoleInList_DoubleClick(object sender, EventArgs e)
7         {
8             DeleteRoleName();
9         }

10、最后,当移动结束之后,就要单击“”将数据保存至数据库,然后整个过程就完成了,由于数据库设计因人而异,所以下面这部份我只列出原理,核心数据库操作就不写了,详见代码:

 1         private void btnSave_Click(object sender, EventArgs e)
 2         {
 3             //系統自動全選
 4             int lCount = ltbRoleInList.Items.Count;
 5             for (int i = 0; i < lCount; i++)
 6             {
 7                 ltbRoleInList.SetSelected(i, true);
 8             }
 9 
10             //然后獲取分配的列表
11             List<string> saveList = GetRightSelectedList();
12             try
13             {
14                 //調用寫好的方法移除該用戶的所有權限,然后重新Insert
15                 oCimUserRole.DeleteSysUserInRole();
16 
17                 foreach (var item in saveList)
18                 {
19                     oCimUserRole.roleName = item.ToString();    //oCimUserRole.roleName 是權限名稱,這個需要傳進去(這里要視你的項目具體而定的)
20                     oCimUserRole.InsertSysUserInRole();         //往數據庫插入一條記錄
21                 }
22                 MessageBox.Show("保存成功!", "提示");
23             }
24             catch (Exception)
25             {
26                 MessageBox.Show("保存失敗!", "提示");
27                 throw;
28             }
29         }

好了,谢谢阅读,如果觉得有用,记得顶一个,呵呵。

原文地址:https://www.cnblogs.com/seasons1987/p/2995884.html