Deverpress笔记之TreeList复选框实现

来源:互联网 发布:淘宝宝贝图片批量下载 编辑:程序博客网 时间:2024/05/16 01:17
分类: .net技术 1313人阅读 评论(0)收藏举报

 TreeList] Deverpress笔记之TreeList复选框实现

声明:此笔记仅为方便本人记忆,写的的一些小技巧,因项目工期较紧,代码未来得及整理,也并未全部在项目中采用,不一定适用于您的开发,故仅供参考之用! 如您在此控件使用过程中遇到类似问题需要解决。欢迎一起讨论。

一、TreeList的GetStateImage事件应用。
方法一:此事件用于在tree之前设置显示的图片,具体使用方法是首先在窗体上放置imagelist,设置好图片,即可在事件中判断后,选择要显示的图片的索引值即可。
  1. private void treeList_GetStateImage(object sender, DevExpress.XtraTreeList.GetStateImageEventArgs e)  
  2.   {
  3.    CheckState check = GetCheckState(e.Node.Tag);
  4.    if(check == CheckState.Unchecked)
  5.     e.NodeImageIndex = 0;
  6.    else if(check == CheckState.Checked)
  7.     e.NodeImageIndex = 1;
  8.    else e.NodeImageIndex = 2;
  9.   }
复制代码
方法二:为tree中指定的节点区分现实不同的图片。
事例代码如下:
  1. private void roleTree_GetStateImage(object sender, DevExpress.XtraTreeList.GetStateImageEventArgs e)
  2.         {
  3.             if(e.Node.Id.ToString() == "0")
  4.             {
  5.                 this.roleTree.Nodes[0].RootNode.StateImageIndex = 1;
  6.             }
  7.             else
  8.             {
  9.                 e.NodeImageIndex = 0;
  10.             }
  11.         }
复制代码
二、TreeList中运用MouseDown事件获取所选节点信息。
提取tree中的值所用事件为MouseDown,在事件中填写如下代码
  1. private void roleTree_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
  2. {
  3. if(e.Button == MouseButtons.Left)
  4. {
  5. DevExpress.XtraTreeList.TreeListHitInfo hInfo = roleTree.GetHitInfo(new Point(e.X, e.Y));
  6. if(hInfo.HitInfoType == DevExpress.XtraTreeList.HitInfoType.StateImage)
  7. {
  8. // this.roleTree.DeleteNode(hInfo.Node);
  9. if(MessageBox.Show("你确定要删除"+hInfo.Node[1].ToString()+"角色","提示信息",MessageBoxButtons.YesNo,MessageBoxIcon.Question)==DialogResult.Yes)
  10. {
  11. TB_Accounts_RolesEntity role = new TB_Accounts_RolesEntity();
  12. role.iRoleID = Convert.ToInt32(hInfo.Node[1].ToString());
  13. role.Retrieve();
  14. role.Delete();
  15. InitRoleTree();
  16. }
  17. else
  18. {}
  19. }
  20. else if(hInfo.HitInfoType == DevExpress.XtraTreeList.HitInfoType.Cell)
  21. {
  22. // MessageBox.Show(hInfo.Node[1].ToString()); //获取选择的iRoleID
  23. // SetCheckedNode(treeList.Nodes[0].Nodes[0]);
  24. //得到指定iRoleID的全部的vDescript的允许的Table
  25. string roleID = hInfo.Node[1].ToString();
  26. string sqlString="SELECT dbo.TB_Accounts_Permissions.vDescript FROM dbo.TB_Accounts_Permissions INNER JOIN dbo.TB_Accounts_RolePermissions ON dbo.TB_Accounts_Permissions.iPermissionID = dbo.TB_Accounts_RolePermissions.iPermissionID WHERE 1=1"; //编写SQL语句
  27. sqlString +=" and dbo.TB_Accounts_RolePermissions.iRoleID = '"+roleID+"'";
  28. //执行SQL语句
  29. DataTable dt=Query.ProcessSql(sqlString,"EasySales");
  30. for(int i = 0; i<dt.Rows.Count; i++)
  31. {
  32. string treeText = treeList.GetNodeByVisibleIndex(i).GetDisplayText(0).ToString();
  33. if(treeText == dt.Rows[i]["vDescript"].ToString())
  34. {
  35. SetCheckedNode(treeList.Nodes[0].Nodes[i]);
  36. }
  37. }
  38. /**/////// //判断treeList的行数和DataTable的行数是否一致
  39. ////// if(this.treeList.VisibleNodesCount.ToString()==dt.Rows.Count.ToString())
  40. ////// {
  41. //////
  42. ////// //循环treeList的全部的vDescript的值
  43. ////// for(int i = 0; i<Convert.ToInt32(this.treeList.VisibleNodesCount.ToString());i++)
  44. ////// {
  45. ////// //判断treeList的vDescript的值和Table的vDescipte的值是否相等
  46. ////// if(this.treeList.GetNodeByVisibleIndex(i).GetDisplayText(0).ToString() != dt.Rows[i]["vDescript"].ToString())
  47. ////// {
  48. ////// MessageBox.Show("得到不同的vDescript");
  49. //////// Checked();
  50. ////// }
  51. ////// else
  52. ////// {
  53. ////// MessageBox.Show("得到相同的vDescript");
  54. //////// UnChecked();
  55. ////// }
  56. ////// }
  57. ////// }
  58. ////// else
  59. ////// {
  60. ////// MessageBox.Show("长度不一致");
  61. ////// }
  62. }
  63. }
  64. }
复制代码
三、TreeList前添加CheckBox的选择框,可实现点击父节点相应子节点全部选中的效果。
TreeList中并为提供对应实现此功能的CheckBox自定义列,故必须用上面提到的GetStateImage事件添加三个(全选、部分全选、为选中)CheckBox的图片,具体样式可自己设计,然后放到窗体中的ImageList中去,触发及调用用到下面的代码:
  1. private CheckState GetCheckState(object obj)
  2. {
  3. if(obj != null) return (CheckState)obj;
  4. return CheckState.Unchecked;
  5. }
  6. private void SetCheckedNode(string treeText)
  7. {
  8. CheckState check = new CheckState();
  9. check = CheckState.Checked;
  10. }
  11. private void SetCheckedNode(DevExpress.XtraTreeList.Nodes.TreeListNode node)
  12. {
  13. CheckState check = GetCheckState(node.Tag);
  14. if(check == CheckState.Indeterminate || check == CheckState.Unchecked) check = CheckState.Checked;
  15. else check = CheckState.Unchecked;
  16. treeList.BeginUpdate();
  17. node.Tag = check;
  18. SetCheckedChildNodes(node, check);
  19. SetCheckedParentNodes(node, check);
  20. treeList.EndUpdate();
  21. }
  22. private void SetCheckedChildNodes(DevExpress.XtraTreeList.Nodes.TreeListNode node, CheckState check)
  23. {
  24. for(int i = 0; i < node.Nodes.Count; i++)
  25. {
  26. node.Nodes[i].Tag = check;
  27. SetCheckedChildNodes(node.Nodes[i], check);
  28. }
  29. }
  30. private void SetCheckedParentNodes(DevExpress.XtraTreeList.Nodes.TreeListNode node, CheckState check)
  31. {
  32. if(node.ParentNode != null)
  33. {
  34. bool b = false;
  35. for(int i = 0; i < node.ParentNode.Nodes.Count; i++)
  36. {
  37. if(!check.Equals(node.ParentNode.Nodes[i].Tag))
  38. {
  39. b = !b;
  40. break;
  41. }
  42. }
  43. node.ParentNode.Tag = b ? CheckState.Indeterminate : check;
  44. SetCheckedParentNodes(node.ParentNode, check);
  45. }
  46. }
  47. private void treeList_GetStateImage(object sender, DevExpress.XtraTreeList.GetStateImageEventArgs e)
  48. {
  49. CheckState check = GetCheckState(e.Node.Tag);
  50. if(check == CheckState.Unchecked)
  51. e.NodeImageIndex = 0;
  52. else if(check == CheckState.Checked)
  53. e.NodeImageIndex = 1;
  54. else e.NodeImageIndex = 2;
  55. }
  56. private void treeList_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
  57. {
  58. if(e.KeyData == Keys.Space)
  59. SetCheckedNode(treeList.FocusedNode);
  60. }
  61. private void treeList_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
  62. {
  63. if(e.Button == MouseButtons.Left)
  64. {
  65. DevExpress.XtraTreeList.TreeListHitInfo hInfo = treeList.GetHitInfo(new Point(e.X, e.Y));
  66. if(hInfo.HitInfoType == DevExpress.XtraTreeList.HitInfoType.StateImage)
  67. SetCheckedNode(hInfo.Node);
  68. }
  69. }
  70. private void roleTree_GetStateImage(object sender, DevExpress.XtraTreeList.GetStateImageEventArgs e)
  71. {
  72. if(e.Node.Id.ToString() == "0")
  73. {
  74. this.roleTree.Nodes[0].RootNode.StateImageIndex = 1;
  75. }
  76. else
  77. {
  78. e.NodeImageIndex = 0;
  79. }
  80. }
复制代码
这样就可实现上述功能。

四、Grid中设置、获取指定Cell的值,用下面的方法:
获取:GridView.GetRowCellValue()
设置:GridView.SetRowCellValue()
原创粉丝点击