DKButtonTreeView.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. /*******************************************************************************
  2. * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential
  3. * 类的信息:
  4. * 1.程序名称:DKButtonTreeView.cs
  5. * 2.功能描述:系统导航栏中Button和TreeView形式用户控件
  6. * 编辑履历:
  7. * 作者 日期 版本 修改内容
  8. * 张国印 2014/08/27 1.00 新建
  9. *******************************************************************************/
  10. using System;
  11. using System.Collections.Generic;
  12. using System.ComponentModel;
  13. using System.Drawing;
  14. using System.Data;
  15. using System.Linq;
  16. using System.Text;
  17. using System.Windows.Forms;
  18. namespace Dongke.IBOSS.PRD.Basics.BaseControls
  19. {
  20. /// <summary>
  21. /// 系统导航栏中Button和TreeView形式用户控件
  22. /// </summary>
  23. public partial class DKButtonTreeView : UserControl, IDKControl
  24. {
  25. #region 自定义控件公用属性和对外事件定义
  26. public delegate void TreeView_DoubleClick(object sender, EventArgs e);
  27. public event TreeView_DoubleClick TreeViewDoubleClick;
  28. public delegate void TreeView_AfterCollapse(object sender, TreeViewEventArgs e);
  29. public event TreeView_AfterCollapse TreeViewAfterCollapse;
  30. public delegate void TreeView_AfterExpand(object sender, TreeViewEventArgs e);
  31. public event TreeView_AfterExpand TreeViewAfterExpand;
  32. public delegate TreeNode TreeView_GetTreeViewNodes(string appID);
  33. public event TreeView_GetTreeViewNodes GetTreeViewNodes;
  34. public Dictionary<string, string> dicButton;
  35. private int buttonHight = 28;
  36. private int buttonCount = 0;
  37. private bool _beginAsyncStatus; // 异步处理开始时,控件状态
  38. #endregion
  39. #region 构造函数
  40. public DKButtonTreeView()
  41. {
  42. InitializeComponent();
  43. this.dicButton = new Dictionary<string, string>();
  44. }
  45. public DKButtonTreeView(Dictionary<string, string> pDicButtons)
  46. {
  47. InitializeComponent();
  48. this.dicButton = pDicButtons;
  49. }
  50. #endregion
  51. #region 对应事件处理
  52. private void DKButtonTreeView_Load(object sender, EventArgs e)
  53. {
  54. ButtonAndTreeIni();
  55. }
  56. private void panelMemu_Layout(object sender, LayoutEventArgs e)
  57. {
  58. this.tvMemu.Width = this.panelMemu.Width - 2;
  59. this.tvMemu.Height = this.panelMemu.Height - (buttonCount * buttonHight);
  60. }
  61. private void tvMemu_DoubleClick(object sender, EventArgs e)
  62. {
  63. if (TreeViewDoubleClick != null)
  64. {
  65. TreeViewDoubleClick(sender, e);
  66. }
  67. }
  68. private void tvMemu_AfterCollapse(object sender, TreeViewEventArgs e)
  69. {
  70. if (TreeViewAfterCollapse != null)
  71. {
  72. TreeViewAfterCollapse(sender, e);
  73. e.Node.SelectedImageIndex = 0;
  74. e.Node.ImageIndex = 0;
  75. }
  76. }
  77. private void tvMemu_AfterExpand(object sender, TreeViewEventArgs e)
  78. {
  79. if (TreeViewAfterExpand != null)
  80. {
  81. e.Node.SelectedImageIndex = 2;
  82. e.Node.ImageIndex = 2;
  83. TreeViewAfterExpand(sender, e);
  84. }
  85. }
  86. #endregion
  87. #region 自定义方法
  88. /// <summary>
  89. /// 设置要显示的一级菜单项目
  90. /// </summary>
  91. /// <param name="pDicButtons"></param>
  92. public void SetMenuDictionart(Dictionary<string, string> pDicButtons)
  93. {
  94. this.dicButton = pDicButtons;
  95. ButtonAndTreeIni();
  96. }
  97. /// <summary>
  98. /// 设置空间的停靠属性,默认第一个面板展开
  99. /// </summary>
  100. /// <param name="index"></param>
  101. private void SetSplitContainerDock(int index)
  102. {
  103. foreach (Control control in this.panelMemu.Controls)
  104. {
  105. if (control is Button)
  106. {
  107. Button btn = (Button)control;
  108. if (btn.TabIndex > index)
  109. {
  110. if (btn.Dock != DockStyle.Bottom)
  111. {
  112. btn.Dock = DockStyle.Bottom;
  113. btn.BringToFront(); //把控件置于顶层
  114. }
  115. }
  116. else
  117. {
  118. if (btn.Dock != DockStyle.Top)
  119. {
  120. btn.Dock = DockStyle.Top;
  121. btn.BringToFront(); //把控件置于顶层
  122. }
  123. }
  124. }
  125. this.tvMemu.Left = 0;
  126. this.tvMemu.Top = index * buttonHight;
  127. }
  128. }
  129. /// <summary>
  130. /// 根据模块编号获取该模块下的数据
  131. /// </summary>
  132. /// <param name="appId"></param>
  133. private void GetModulesOfApplication(string appId)
  134. {
  135. if (GetTreeViewNodes != null)
  136. {
  137. this.tvMemu.Nodes.Clear();
  138. TreeNode tempNode = GetTreeViewNodes(appId);
  139. if (tempNode != null)
  140. {
  141. this.tvMemu.Nodes.Add(tempNode);
  142. this.tvMemu.ExpandAll();
  143. if (this.tvMemu.Nodes != null && this.tvMemu.Nodes.Count > 0)
  144. {
  145. this.tvMemu.Nodes[0].EnsureVisible();
  146. }
  147. }
  148. }
  149. }
  150. /// <summary>
  151. /// 初始化用户控件方法
  152. /// </summary>
  153. private void ButtonAndTreeIni()
  154. {
  155. int width = this.panelMemu.Width;
  156. int index = 0;
  157. int tabIndex = 0;
  158. string applicationId = "01";
  159. if (this.dicButton.Count > 0)
  160. {
  161. buttonCount = this.dicButton.Count;
  162. Button[] btnCollections = new Button[buttonCount];
  163. foreach (var newKey in dicButton)
  164. {
  165. #region 为Button控件赋值
  166. Button btn = new Button
  167. {
  168. Tag = newKey.Key,
  169. Text = newKey.Value,
  170. Width = width - 2,
  171. Height = buttonHight,
  172. Dock = DockStyle.Top,
  173. BackColor = SystemColors.Control,
  174. UseVisualStyleBackColor = false, //不使用XP主题样式
  175. TextAlign = ContentAlignment.MiddleCenter,
  176. TabIndex = index + 1,
  177. };
  178. #endregion
  179. #region 设置Button控件事件
  180. btn.Click += (s, ex) =>
  181. {
  182. Button clickedButton = (Button)s;
  183. int clickedButtonTabIndex = clickedButton.TabIndex;
  184. //设置按钮的停靠顺序
  185. SetSplitContainerDock(clickedButtonTabIndex);
  186. //加载系统菜单
  187. string strTag = clickedButton.Tag.ToString();
  188. GetModulesOfApplication(strTag);
  189. this.tvMemu.BringToFront();
  190. this.tvMemu.Focus(); //2014-9-30 张国印 增加 用于获取焦点 使得滚动条可用
  191. };
  192. #endregion
  193. if (index == 0)
  194. {
  195. tabIndex = 1;
  196. applicationId = btn.Tag.ToString();
  197. }
  198. btnCollections[index++] = btn;
  199. }
  200. Array.Reverse(btnCollections); //反转数组,改变控件的Z顺序,此句将直接影响下面添加的顺序
  201. this.panelMemu.Controls.AddRange(btnCollections);
  202. SetSplitContainerDock(tabIndex); //设置按钮的停靠顺序
  203. GetModulesOfApplication(applicationId); //加载系统菜单
  204. this.panelMemu.Padding = new Padding { Left = 0, Right = 0 }; //设置折叠面板和外边缘的间隔像素
  205. this.tvMemu.Width = width - 2;
  206. this.tvMemu.Height = this.panelMemu.Height - (buttonCount * buttonHight);
  207. this.tvMemu.Focus(); //2014-9-30 张国印 增加 用于获取焦点 使得滚动条可用
  208. }
  209. }
  210. #endregion
  211. #region 公有方法
  212. /// <summary>
  213. /// 异步处理开始
  214. /// </summary>
  215. public void BeginAsync()
  216. {
  217. this._beginAsyncStatus = this.Enabled;
  218. this.Enabled = true;
  219. }
  220. /// <summary>
  221. /// 异步处理结束
  222. /// </summary>
  223. public void EndAsync()
  224. {
  225. this.Enabled = this._beginAsyncStatus;
  226. }
  227. #endregion
  228. }
  229. }