国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - Winform界面中實現菜單列表的動態個性化配置管理方法

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

2022-02-13 15:21伍華聰 C#

下面小編就為大家分享一篇Winform界面中實現菜單列表的動態個性化配置管理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

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

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

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

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

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

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

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

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

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

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

1)參數的數據存儲

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
/// <summary>
 /// 用來控制人員管理顯示菜單的參數配置
 /// </summary>
 public class usermenuparameter
 {
  [defaultvalue("")]
  [description("用戶id")]
  public string userid { get; set; }
  
  
  [description("用戶設置可見的菜單")]
  public dictionary<string, bool> visibledict { get; set; }
 }

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

?
1
2
3
4
//參數存儲所需的相關對象
private settingsprovider settings;
private isettingsstorage store;
private usermenuparameter parameter;

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

?
1
2
3
4
5
// portablestorage: 在運行程序目錄創建一個setting的文件記錄參數數據
// databasestorage:在數據庫tb_userparameter表存儲用戶配置參數
store = new databasestorage(loginuserinfo.id);
settings = new settingsprovider(store);
parameter = settings.getsettings<usermenuparameter>();

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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的函數實現菜單的顯示。

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/// <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界面中實現菜單列表的動態個性化配置管理方法

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/// <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;
  }

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/// <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)主界面的相關處理

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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界面中實現菜單列表的動態個性化配置管理方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/wuhuacong/p/7877830.html

延伸 · 閱讀

精彩推薦
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
主站蜘蛛池模板: 亚洲综合无码一区二区 | av不卡在线 | 在线观看亚洲专区 | 91亚洲国产精品 | 欧美一级片在线观看 | 曰韩中文字幕 | 韩日在线 | 久久精品亚洲精品国产欧美kt∨ | 黄色毛片a| 亚洲精品国精品久久99热 | 免费国产视频 | 日韩在线中文字幕 | 国产一区二区三区四区hd | 亚洲精品一区二区三区樱花 | 91久久久久久久久久 | 国产精品美女久久久久久久网站 | 高清国产一区二区三区 | 玖玖爱国产 | 欧美视频在线一区 | 久久久国产视频 | 精品二区 | 欧美一区二区在线视频 | 午夜在线| 国产区在线 | 日韩欧美三级 | 欧美久久精品一级黑人c片 成人在线视频免费观看 | 一区二区三区入口 | 国产欧美一区二区 | 欧美一区二区三区的 | 黄a在线 | 久久精品成人 | 亚洲视频在线观看免费 | 欧美久久久网站 | 国产精品美女久久久久久久久久久 | 亚洲精品久久久一区二区三区 | 在线免费观看av电影 | 一区二区三区免费 | 久久人 | 在线看黄网站 | 在线观看成人国产 | 欧美一区二区三区在线看 |