/******************************************************************************* * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential * 类的信息: * 1.程序名称:DKButtonTreeView.cs * 2.功能描述:系统导航栏中Button和TreeView形式用户控件 * 编辑履历: * 作者 日期 版本 修改内容 * 张国印 2014/08/27 1.00 新建 *******************************************************************************/ using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; namespace Dongke.IBOSS.PRD.Basics.BaseControls { /// /// 系统导航栏中Button和TreeView形式用户控件 /// public partial class DKButtonTreeView : UserControl, IDKControl { #region 自定义控件公用属性和对外事件定义 public delegate void TreeView_DoubleClick(object sender, EventArgs e); public event TreeView_DoubleClick TreeViewDoubleClick; public delegate void TreeView_AfterCollapse(object sender, TreeViewEventArgs e); public event TreeView_AfterCollapse TreeViewAfterCollapse; public delegate void TreeView_AfterExpand(object sender, TreeViewEventArgs e); public event TreeView_AfterExpand TreeViewAfterExpand; public delegate TreeNode TreeView_GetTreeViewNodes(string appID); public event TreeView_GetTreeViewNodes GetTreeViewNodes; public Dictionary dicButton; private int buttonHight = 28; private int buttonCount = 0; private bool _beginAsyncStatus; // 异步处理开始时,控件状态 #endregion #region 构造函数 public DKButtonTreeView() { InitializeComponent(); this.dicButton = new Dictionary(); } public DKButtonTreeView(Dictionary pDicButtons) { InitializeComponent(); this.dicButton = pDicButtons; } #endregion #region 对应事件处理 private void DKButtonTreeView_Load(object sender, EventArgs e) { ButtonAndTreeIni(); } private void panelMemu_Layout(object sender, LayoutEventArgs e) { this.tvMemu.Width = this.panelMemu.Width - 2; this.tvMemu.Height = this.panelMemu.Height - (buttonCount * buttonHight); } private void tvMemu_DoubleClick(object sender, EventArgs e) { if (TreeViewDoubleClick != null) { TreeViewDoubleClick(sender, e); } } private void tvMemu_AfterCollapse(object sender, TreeViewEventArgs e) { if (TreeViewAfterCollapse != null) { TreeViewAfterCollapse(sender, e); e.Node.SelectedImageIndex = 0; e.Node.ImageIndex = 0; } } private void tvMemu_AfterExpand(object sender, TreeViewEventArgs e) { if (TreeViewAfterExpand != null) { e.Node.SelectedImageIndex = 2; e.Node.ImageIndex = 2; TreeViewAfterExpand(sender, e); } } #endregion #region 自定义方法 /// /// 设置要显示的一级菜单项目 /// /// public void SetMenuDictionart(Dictionary pDicButtons) { this.dicButton = pDicButtons; ButtonAndTreeIni(); } /// /// 设置空间的停靠属性,默认第一个面板展开 /// /// private void SetSplitContainerDock(int index) { foreach (Control control in this.panelMemu.Controls) { if (control is Button) { Button btn = (Button)control; if (btn.TabIndex > index) { if (btn.Dock != DockStyle.Bottom) { btn.Dock = DockStyle.Bottom; btn.BringToFront(); //把控件置于顶层 } } else { if (btn.Dock != DockStyle.Top) { btn.Dock = DockStyle.Top; btn.BringToFront(); //把控件置于顶层 } } } this.tvMemu.Left = 0; this.tvMemu.Top = index * buttonHight; } } /// /// 根据模块编号获取该模块下的数据 /// /// private void GetModulesOfApplication(string appId) { if (GetTreeViewNodes != null) { this.tvMemu.Nodes.Clear(); TreeNode tempNode = GetTreeViewNodes(appId); if (tempNode != null) { this.tvMemu.Nodes.Add(tempNode); this.tvMemu.ExpandAll(); if (this.tvMemu.Nodes != null && this.tvMemu.Nodes.Count > 0) { this.tvMemu.Nodes[0].EnsureVisible(); } } } } /// /// 初始化用户控件方法 /// private void ButtonAndTreeIni() { int width = this.panelMemu.Width; int index = 0; int tabIndex = 0; string applicationId = "01"; if (this.dicButton.Count > 0) { buttonCount = this.dicButton.Count; Button[] btnCollections = new Button[buttonCount]; foreach (var newKey in dicButton) { #region 为Button控件赋值 Button btn = new Button { Tag = newKey.Key, Text = newKey.Value, Width = width - 2, Height = buttonHight, Dock = DockStyle.Top, BackColor = SystemColors.Control, UseVisualStyleBackColor = false, //不使用XP主题样式 TextAlign = ContentAlignment.MiddleCenter, TabIndex = index + 1, }; #endregion #region 设置Button控件事件 btn.Click += (s, ex) => { Button clickedButton = (Button)s; int clickedButtonTabIndex = clickedButton.TabIndex; //设置按钮的停靠顺序 SetSplitContainerDock(clickedButtonTabIndex); //加载系统菜单 string strTag = clickedButton.Tag.ToString(); GetModulesOfApplication(strTag); this.tvMemu.BringToFront(); this.tvMemu.Focus(); //2014-9-30 张国印 增加 用于获取焦点 使得滚动条可用 }; #endregion if (index == 0) { tabIndex = 1; applicationId = btn.Tag.ToString(); } btnCollections[index++] = btn; } Array.Reverse(btnCollections); //反转数组,改变控件的Z顺序,此句将直接影响下面添加的顺序 this.panelMemu.Controls.AddRange(btnCollections); SetSplitContainerDock(tabIndex); //设置按钮的停靠顺序 GetModulesOfApplication(applicationId); //加载系统菜单 this.panelMemu.Padding = new Padding { Left = 0, Right = 0 }; //设置折叠面板和外边缘的间隔像素 this.tvMemu.Width = width - 2; this.tvMemu.Height = this.panelMemu.Height - (buttonCount * buttonHight); this.tvMemu.Focus(); //2014-9-30 张国印 增加 用于获取焦点 使得滚动条可用 } } #endregion #region 公有方法 /// /// 异步处理开始 /// public void BeginAsync() { this._beginAsyncStatus = this.Enabled; this.Enabled = true; } /// /// 异步处理结束 /// public void EndAsync() { this.Enabled = this._beginAsyncStatus; } #endregion } }