Winform界面中实现菜单列表的动态个性化配置管理方法

2019-12-30 18:38:34王冬梅

这样确保了,在参数没有配置前,所有的菜单对当前用户是可见的,只有用户设置为不不可见,该菜单才不显示为不可见。


/// <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)主界面的相关处理

以上处理完成后,我们在主界面的工具栏右键菜单添加一个菜单项,用来进入配置界面的,如下逻辑代码所示。