在上篇總結隨筆《Winform開發框架之權限管理系統改進的經驗總結()TreeListLookupEdit控件的使用》介紹了權限管理模塊的用戶管理部分其中主要介紹了其中的用戶所屬公司所屬部門直屬經理(人員列表)的幾級數據級聯的展示通過引入TreeListLookupEdit控件能增強用戶的體驗效果本篇繼續介紹權限系統模塊中的一些閃光點介紹組織機構管理裡面選擇用戶的界面設計和實現用戶選擇在很多場合會用到如組織機構的用戶選擇角色裡面的用戶選擇或者流程裡面的用戶選擇等用途
選擇用戶界面效果展示
用戶選擇在很多地方需要用到本篇以組織機構裡面的用戶選擇為例介紹用戶選擇的界面效果我們知道用戶一般可以按組織機構進行分類也可以按照角色進行分類因此我們需要結合兩者進行快速展示用戶的層次關系界面效果如下所示
在上面的界面分為三個部分左邊主要是機構和角色的展示右邊則是通過列表控件進行展示並可以進行勾選的操作底部則是已選用戶的列表展示(可以移除)
左邊機構樹的遞歸展現
組織機構本身設計就是一個有層次關系的樹因此它可以通過遞歸函數進行展現展示方式可以使用傳統樣式的TreeView控件或者DevExpress樣式的TreeList控件不過我傾向於使用TreeView覺得這個線狀的層次關系更美觀一些遞歸展示結構樹的代碼如下所示
private void InitDeptTree()
{
thistreeDeptBeginUpdate();
thistreeDeptNodesClear();
TreeNode node = new TreeNode();
nodeText = 所有部門;
List<OUNodeInfo> list = BLLFactory<OU>InstanceGetTree();
AddDept(list node);
thistreeDeptNodesAdd(node);
thistreeDeptExpandAll();
thistreeDeptEndUpdate();
}
private void AddDept(List<OUNodeInfo> list TreeNode treeNode)
{
foreach (OUNodeInfo ouInfo in list)
{
TreeNode deptNode = new TreeNode();
deptNodeText = ouInfoName;
deptNodeTag = ouInfoID;
deptNodeImageIndex = PortalgcGetImageIndex(ouInfoCategory);
deptNodeSelectedImageIndex = PortalgcGetImageIndex(ouInfoCategory);
treeNodeNodesAdd(deptNode);
AddDept(ouInfoChildren deptNode);
}
}
角色樹不是一個遞歸的關系因此只需要按列表展示即可展示代碼如下所示
private void InitRoleTree()
{
thistreeRoleBeginUpdate();
thistreeRoleNodesClear();
TreeNode node = new TreeNode();
nodeText = 所有角色;
List<RoleInfo> list = BLLFactory<Role>InstanceGetAll();
foreach (RoleInfo info in list)
{
TreeNode roleNode = new TreeNode();
roleNodeText = infoName;
roleNodeTag = infoID;
roleNodeImageIndex = ;
roleNodeSelectedImageIndex = ;
nodeNodesAdd(roleNode);
}
thistreeRoleNodesAdd(node);
thistreeRoleExpandAll();
thistreeRoleEndUpdate();
}
角色列表大概效果如下所示
右邊可勾選列表的實現
右邊其實可以通過一般的GridView進行展示但為了更好的封裝和使用我使用我的Winform分頁控件中的WinGridview對象進行展示這樣使用起來更簡便
public partial class FrmSelectUser : BaseForm
{
public FrmSelectUser()
{
InitializeComponent();
thiswinGridViewShowCheckBox = true;
thiswinGridViewShowExportButton = false;
thiswinGridViewShowLineNumber = true;
thiswinGridViewBestFitColumnWith = false;//是否設置為自動調整寬度false為不設置
thiswinGridViewOnRefresh += new EventHandler(winGridView_OnRefresh);
thiswinGridViewgridViewDataSourceChanged += new EventHandler(gridView_DataSourceChanged);
if (!thisDesignMode)
{
InitDeptTree();
InitRoleTree();
}
}
綁定數據是通過左邊的樹進行條件檢索的因此可以通過獲取組織機構或者角色的節點數據進行查詢我們通過判斷組織機構樹節點或者角色樹節點是否選中來判斷即可具體列表綁定的代碼如下所示
private void BindGridData()
{
List<UserInfo> list = new List<UserInfo>();
if (thistreeDeptSelectedNode != null && thistreeDeptSelectedNodeTag != null)
{
int ouId = thistreeDeptSelectedNodeTagToString()ToInt();
list = BLLFactory<User>InstanceFindByDept(ouId);
}
else if (thistreeRoleSelectedNode != null && thistreeRoleSelectedNodeTag != null)
{
int roleId = thistreeRoleSelectedNodeTagToString()ToInt();
list = BLLFactory<User>InstanceGetUsersByRole(roleId);
}
//entity
thiswinGridViewDisplayColumns = HandNoNameFullNameTitleMobilePhoneOfficePhoneEmailGenderQQNote;
thiswinGridViewColumnNameAlias = BLLFactory<User>InstanceGetColumnNameAlias();//字段列顯示名稱轉義
thiswinGridViewDataSource = new WHCPagerWinControlSortableBindingList<UserInfo>(list);
}
單用戶勾選列表的復選框的時候該行的數據會被選中我們最後要獲取用戶的勾選記錄(通過WinGridview控件的GetCheckedRows方法獲取)然後獲取對應的數據添加到關聯關系的數據庫即可具體代碼如下所示
private void btnAddUser_Click(object sender EventArgs e)
{
List<int> list = thiswinGridViewGetCheckedRows();
foreach(int rowIndex in list)
{
string ID = thiswinGridViewGridViewGetRowCellDisplayText(rowIndex ID);
string Name= thiswinGridViewGridViewGetRowCellDisplayText(rowIndex Name);
string FullName = thiswinGridViewGridViewGetRowCellDisplayText(rowIndex FullName);
string displayname = stringFormat({}({}) FullName Name);
if (!thisSelectUserDictContainsKey(ID))
{
thisSelectUserDictAdd(ID displayname);
}
}
RefreshSelectItems();
}
用戶選擇結果的展示
在一些場景中我們可能需要在多個組織機構和角色中選擇不同的用戶為了更方便展示我們選中的記錄我設計了一個用戶控件(一個刪除按鈕(Button)+標簽控件(Lable))組合即可如下所示
由於我們選擇的內容無非就是選擇它的人員名稱即可如果需要單擊刪除按鈕讓用戶剔除不需要的人員因此控件增加一個OnDeleteItem事件用來處理這個刪除操作
我們展示多個用戶信息的時候就是通過構造多個這樣的控件並動態增加到Panel裡面即可實現代碼如下所示
/// <summary>
/// 刷新選擇信息
/// </summary>
private void RefreshSelectItems()
{
thisflowLayoutPanelControlsClear();
foreach (string key in SelectUserDictKeys)
{
string info = SelectUserDict[key];
if (!stringIsNullOrEmpty(info))
{
UserNameControl control = new UserNameControl();
controlBindData(key info);
controlOnDeleteItem += new UserNameControlDeleteEventHandler(control_OnDeleteItem);
thisflowLayoutPanelControlsAdd(control);
}
}
thislblItemCountText = stringFormat(當前選擇【{}】項目 SelectUserDictKeysCount);
}
最終的組織機構管理界面效果
在開篇說了用戶選擇在很多場合會用到如組織機構的用戶選擇角色裡面的用戶選擇或者流程裡面的用戶選擇等用途
下面是組織機構裡面的主體界面
在右上角的包含用戶區域單擊添加按鈕就會出現前面說到的用戶選擇對話框如下所示
伍華聰
From:http://tw.wingwit.com/Article/program/Web/201404/30644.html