亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

Winform界面中實現菜單列表的動態個性化配置管理方法

2019-10-29 21:07:59
字體:
來源:轉載
供稿:網友

在我們一般的應用系統里面,由于系統是面向不同類型的用戶,我們所看到的菜單會越來越多,多一點的甚至上百個,但是我們實際工作接觸的菜單可能就是那么幾個,那么對于這種龐大的菜單體系,尋找起來非常不便。因此對菜單的個性化配置就顯得尤為重要,本篇隨筆就是基于這樣的理念,提供用戶對可見菜單進行一個動態配置,只選自己喜歡、常用的菜單顯示出來即可,菜單的配置存儲在數據庫里面,在不同的客戶端體驗都是一樣。本篇隨筆主要介紹實現這樣的功能的一個完整思路,部分代碼邏輯可供參考。

1、 菜單列表的動態個性化配置的過程

在我們有些軟件里面,我們可能在界面上頂部放置菜單,也可能在界面的左側放置樹形列表菜單,這種情況都有可能,本篇摘取其中之一,左側菜單進行一個介紹菜單的配置處理。

例如我們在左側根據用戶權限展示相關的菜單信息,動態生成整個列表展示,大致的界面效果如下所示。

Winform,菜單列表,動態,個性化,配置

然后在功能列表上提供一個右鍵的菜單進行菜單的刷新、配置管理,如下界面所示。

Winform,菜單列表,動態,個性化,配置

通過配置功能,我們讓用戶進入一個配置管理界面,在其中配置顯示自己感興趣的菜單,然后進行保存即可,保存后同時刷新界面的功能菜單顯示。

Winform,菜單列表,動態,個性化,配置

以上幾個界面效果就是為了介紹整個菜單配置管理的一般過程,之所以把界面效果放在前面介紹,就是能夠讓我們有一個類似原型設計方式的感性認識,了解了相關的處理過程,我們就可以著手通過編碼的方式來實現這個處理邏輯了。

2、菜單動態個性化配置的功能實現

上面介紹了大概的界面效果,有了參考,我們可以把它的實現思路通過代碼實現出來。

1)參數的數據存儲

首先我們需要了解,用戶配置可以通過XML保存在本地,也可以通過數據庫存儲保存在服務器,后者在分布式的客戶端的時候,可以處處一樣,這樣就不會造成體驗上的差異,因此我們這里采用存儲在數據庫的方案。

這個存儲我們沿用我之前介紹過的配置管理組件(SettingsProvider.net),我在隨筆《Winform開發框架之參數配置管理功能實現-基于SettingsProvider.net的構建》中對它的使用進行了詳細的介紹。

這個配置管理組件SettingsProvider.net使用起來也是比較方便的,可以選擇存儲在本地的對象,也可以選擇存儲在數據庫的存儲對象。

首先我們先定義一個存儲的參數類,這個是使用這個組件所必須的存儲對象信息,如下代碼所示。

/// <summary> /// 用來控制人員管理顯示菜單的參數配置 /// </summary> public class UserMenuParameter {  [DefaultValue("")]  [Description("用戶ID")]  public string UserID { get; set; }      [Description("用戶設置可見的菜單")]  public Dictionary<string, bool> VisibleDict { get; set; } }

需要獲取或存儲這個對象信息的時候,我們初始化幾個管理類,如下代碼所示。

//參數存儲所需的相關對象private SettingsProvider settings;private ISettingsStorage store;private UserMenuParameter parameter;

然后在配置管理界面窗體里面,初始化這幾個對象,如下代碼所示。

// PortableStorage: 在運行程序目錄創建一個setting的文件記錄參數數據// DatabaseStorage:在數據庫TB_UserParameter表存儲用戶配置參數store = new DatabaseStorage(LoginUserInfo.ID);settings = new SettingsProvider(store);parameter = settings.GetSettings<UserMenuParameter>();

這樣我們就可以根據用戶的ID,獲取對應記錄的信息并轉換為相關的對象了,如果我們需要把修改的信息寫會到存儲介質里面,代碼如下所示。

try   {    parameter = settings.GetSettings<UserMenuParameter>();    parameter.VisibleDict = dict;    parameter.UserID = LoginUserInfo.ID;    settings.SaveSettings<UserMenuParameter>(parameter);    ProcessDataSaved(sender, e);//觸發外部事件    this.DialogResult = System.Windows.Forms.DialogResult.OK;   }   catch (Exception ex)   {    LogHelper.Error(ex);    MessageDxUtil.ShowError(ex.Message);    return;   }

2)配置管理界面的實現

解決了參數的獲取及存儲功能后,我們需要編寫一個界面來管理用戶的菜單配置,也就是我們前面介紹的菜單配置管理界面。

Winform,菜單列表,動態,個性化,配置

我們這個界面的定義代碼如下所示。

Winform,菜單列表,動態,個性化,配置

其中參數的數據存儲就是應用了前面介紹的代碼,這里需要根據用戶的配置項初始化樹形菜單的顯示處理,通過InitTree的函數實現菜單的顯示。

在顯示菜單前,我們先介紹一下功能菜單顯示的規則,僅當參數存在對應記錄,并且該記錄顯式設置不可見,菜單才不可見,否則默認菜單是可以看到的。

這樣確保了,在參數沒有配置前,所有的菜單對當前用戶是可見的,只有用戶設置為不不可見,該菜單才不顯示為不可見。

/// <summary>  /// 獲取菜單是否可見。  /// 僅當參數存在對應記錄,并且該記錄顯式設置不可見,菜單才不可見,否則默認菜單是可以看到的。  /// </summary>  /// <param name="id">菜單ID</param>  /// <returns></returns>  private bool GetVisibleMenu(string id)  {   bool result = true;   if (parameter != null)   {    var dict = parameter.VisibleDict;    if(dict != null && dict.ContainsKey(id))    {     result = dict[id];    }   }   return result;  }

顯示菜單的相關處理邏輯,就是根據上面的判斷,然后確定是否勾選記錄,如下代碼所示。

Winform,菜單列表,動態,個性化,配置

存儲用戶勾選的記錄的時候,我們需要遍歷整個樹節點,判斷勾選了那些選項,然后把它保存數據庫即可。

/// <summary>  /// 遞歸獲取選中的樹節點集合  /// </summary>  /// <param name="node">樹節點</param>  /// <param name="dict">字典集合</param>  /// <returns></returns>  private Dictionary<string, bool> GetTreeSelection(TreeNode node, Dictionary<string, bool> dict)  {   if (node.Tag != null)   {    var check = node.Checked;    var menuId = string.Concat(node.Tag);    if(!dict.ContainsKey(menuId))    {     dict.Add(menuId, check);    }   }   foreach (TreeNode child in node.Nodes)   {    GetTreeSelection(child, dict);   }   return dict;  }

參數的保存操作如下所示。

/// <summary>  /// 保存用戶配置信息  /// </summary>  private void btnOK_Click(object sender, EventArgs e)  {   //獲取用戶勾選的樹列表,存放在字典集合里面   var dict = new Dictionary<string, bool>();   foreach(TreeNode node in this.treeView1.Nodes)   {    GetTreeSelection(node, dict);   }   try   {    //重新獲取參數信息,并設置新值后保存    parameter = settings.GetSettings<UserMenuParameter>();    parameter.VisibleDict = dict;    parameter.UserID = LoginUserInfo.ID;    settings.SaveSettings<UserMenuParameter>(parameter);    ProcessDataSaved(sender, e);//觸發外部事件    this.DialogResult = System.Windows.Forms.DialogResult.OK;   }   catch (Exception ex)   {    LogHelper.Error(ex);    MessageDxUtil.ShowError(ex.Message);    return;   }  }

3)主界面的相關處理

以上處理完成后,我們在主界面的工具欄右鍵菜單添加一個菜單項,用來進入配置界面的,如下邏輯代碼所示。

private void tool_MenuSetting_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)  {   MenuSetting();  }  /// <summary>  /// 配置菜單項  /// </summary>  private void MenuSetting()  {   FrmMenuSetting dlg = new FrmMenuSetting();   dlg.OnDataSaved += (s, arg) =>   {    //用戶保存參數后,提示用戶更新樹形列表    InitToolbar();   };   dlg.ShowDialog();  }

這樣界面配置參數并保存后,界面的樹形菜單會及時得到更新處理。

另外,我們主界面的樹形列表,也要根據配置參數的信息作相關的調整,如果用戶配置了不顯示某個菜單,那么主界面也要根據配置參數控制顯示。

Winform,菜單列表,動態,個性化,配置

3、總結

以上就是整個菜單列表的動態個性化配置管理的整體思路和實現步驟代碼,主要的界面考量還是以用戶的視覺來考慮界面的布局和功能,如果在幾百個菜單項中尋找幾個常用的菜單,每次是一個比較耗時無聊的操作,因此提供一個個性化的界面,根據工作情況的不同,顯示一些和自己相關的功能即可。

例如有些情況下,我們的菜單顯示,希望通過工具欄的方式進行控制顯示,如下界面效果所示。

Winform,菜單列表,動態,個性化,配置

那么配置維護界面還是差不多,只是我們控制工具欄的顯示邏輯有所不同而已,對于RibbonPage及其功能菜單的動態生成處理如下所示。

Winform,菜單列表,動態,個性化,配置

本篇隨筆主要還是希望讀者借鑒配置存儲和菜單個性化管理的思路,具體的邏輯會因用戶界面的不同,使用的控件不同而有所差異,不過總體思路是一致的即可。

例如有些參數的配置管理,可以統一使用一個配置管理界面進行維護,如我之前的隨筆介紹的界面功能一樣。

Winform,菜單列表,動態,個性化,配置

以上這篇Winform界面中實現菜單列表的動態個性化配置管理方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜精品久久久久久99热软件| 国产日韩精品综合网站| 视频在线观看99| 亚洲国产精品99| 亚洲japanese制服美女| 国产日韩欧美在线| 亚洲精品720p| 成人午夜小视频| 欧美成人在线影院| 国产成人亚洲综合91| 国产69久久精品成人看| 欧美日韩激情网| 国产亚洲精品久久久优势| 日韩精品一区二区三区第95| 91免费看片在线| 色妞在线综合亚洲欧美| 神马久久久久久| 久久久久免费精品国产| 国产性色av一区二区| 欧美激情视频一区二区| 国产成人精品在线观看| 色视频www在线播放国产成人| 午夜精品久久久久久久男人的天堂| 亚洲性夜色噜噜噜7777| 国产精品久久久久免费a∨大胸| 日韩一区二区三区国产| 欧洲一区二区视频| 欧美最顶级的aⅴ艳星| 91影院在线免费观看视频| 亚洲精品美女在线观看| 91影院在线免费观看视频| 久久精品一本久久99精品| 日韩av网站导航| 国产精品永久免费| 日韩精品在线观看一区| 成人精品一区二区三区电影免费| 久久精品电影一区二区| 欧美又大粗又爽又黄大片视频| 成人在线中文字幕| 日韩黄色高清视频| 91免费看片在线| 7m第一福利500精品视频| 欧美福利视频在线观看| 亚洲视频欧美视频| 国产精品福利网站| 成人国产亚洲精品a区天堂华泰| 国产99久久精品一区二区 夜夜躁日日躁| 精品国产鲁一鲁一区二区张丽| 欧美精品九九久久| 九九久久国产精品| 精品久久久中文| 成人福利网站在线观看| 久久久久久久999| 成人免费看片视频| 欧美高清自拍一区| 精品久久久久久久久久久久| 久久久久久91| 福利微拍一区二区| 国产精品精品视频一区二区三区| 色婷婷**av毛片一区| 国产精品视频一| 国产精品午夜国产小视频| 午夜欧美不卡精品aaaaa| 91久久精品久久国产性色也91| 国产精品一区二区久久久| 国产精品久久久久久中文字| 亚洲欧美日韩中文视频| 久久久久久久久久久免费精品| 中文字幕亚洲一区二区三区五十路| 亚洲欧美日韩精品久久亚洲区| 欧美美女操人视频| 日韩免费电影在线观看| 欧美激情一区二区三区在线视频观看| 久久久久久国产精品久久| 91中文字幕一区| 久久久电影免费观看完整版| 情事1991在线| 亚洲成人黄色在线观看| 亚洲福利视频久久| 97在线精品视频| 久久亚洲精品一区二区| 成人高清视频观看www| 国模视频一区二区| 日韩精品极品在线观看| 国产欧美 在线欧美| 中文字幕日韩av电影| 欧美丝袜第一区| 欧美电影电视剧在线观看| 久久久免费电影| 欧美wwwxxxx| 亚洲精品国产精品乱码不99按摩| 久久免费视频网| 国产在线精品自拍| 久久久久www| 国产精品欧美日韩一区二区| 亚洲理论在线a中文字幕| 久久久久久久一区二区三区| 日韩中文理论片| 亚洲一区二区久久久久久| 国产精品一区久久久| 国产精品a久久久久久| 亚洲欧洲视频在线| 精品亚洲国产视频| 国产精品私拍pans大尺度在线| 欧美日韩爱爱视频| 欧美激情成人在线视频| 综合网日日天干夜夜久久| 亚洲欧洲在线观看| 国产一区二区丝袜| 国产精品高清网站| 久久国产精品久久久久久久久久| 欧美激情乱人伦| 欧美一区二区三区免费视| 亚洲国产精品视频在线观看| 一区三区二区视频| 最近2019年日本中文免费字幕| 国产日韩视频在线观看| 最近免费中文字幕视频2019| 欧美主播福利视频| 中文字幕在线亚洲| 久久九九全国免费精品观看| 国产999精品久久久影片官网| 国产日韩欧美一二三区| 欧美精品在线视频观看| 97av在线视频| 色无极亚洲影院| 98精品在线视频| 国语自产精品视频在线看| 久久视频在线播放| 国内精品久久影院| 91国内揄拍国内精品对白| 国产欧美精品一区二区三区-老狼| 欧美噜噜久久久xxx| 91亚洲精品在线| 久久91精品国产| 一区二区三区日韩在线| 日韩欧美国产骚| 欧美成人黑人xx视频免费观看| 影音先锋欧美在线资源| 亚洲男女性事视频| 国产97在线视频| 亚洲午夜色婷婷在线| 日韩精品视频在线| 亚洲欧美成人一区二区在线电影| 久久久人成影片一区二区三区观看| 成人免费网站在线观看| 日韩免费在线播放| 国产精品www色诱视频| 亚洲第一网站男人都懂| 亚洲欧美一区二区三区四区| 成人中心免费视频| 精品久久久999| 欧美精品午夜视频| 懂色av中文一区二区三区天美| 国产精品中文字幕在线观看| 欧美成人免费全部| 欧美成人小视频| 欧美大尺度电影在线观看| 欧美日韩在线视频观看| 欧美乱大交xxxxx另类电影| 国产丝袜一区二区| 亚洲香蕉在线观看| 81精品国产乱码久久久久久| 亚洲精品99久久久久|