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 }
好了,谢谢阅读,如果觉得有用,记得顶一个,呵呵。