加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Treelist使用

(2012-12-11 13:54:15)
标签:

杂谈

分类: 程序世界

 

Treelist使用

 
 

最近项目中要求用dev 控件的treelist 树形控件。

如下图

http://images.cnblogs.com/cnblogs_com/6303c/%E6%9C%AA%E5%91%BD%E5%90%8D.jpg

要求如下:

1:选择父节点后,子节点全部打钩;

2:选择子节点而不选择父节点,则从当前节点的父节点一直到根节点check框都是半选状态。

具体实现如下:

一、treelist绑定的数据源是数据集(dateset)中的表,而且必须给:(当前节点id)KeyFieldName和(上一级节点id)ParentFieldName 两个属性绑定字段。

二、设置treelist1(名称)中OptionView—ShowCheckBoxes属性为true,则每个节点前面自动增加一个check框。

三、设置OptionBehavior—AllIndeterminateCheckState属性为true,则check框可以出现半选状态。

四、
代码 
         private void treeList1_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
          {
              if (e.Node == null) return;
              System.Data.DataRowView rov treeList1.GetDataRecordByNode(e.Node) as System.Data.DataRowView;
              if (e.Node.CheckState == CheckState.Indeterminate)
              {
                  e.Node.CheckState CheckState.Checked;
              }
             if (e.Node.CheckState == CheckState.Checked)
             {
                 if (e.Node.HasChildren)
                 {
                     CheckNode(e.Node);
                 }
                 ValidParentIsChecked(e.Node);
             }
             else if (e.Node.CheckState == CheckState.Unchecked)
             {
                 if (e.Node.HasChildren)
                 {
                     ClearNode(e.Node);
                 }
                 //从根节点往下 查询 是否有打钩的子节点,如果有那么 父节点的 半选状态不变否则变为 不选择状态
                 ValidParentNodeIsCanleSel(e.Node);
            }
         }
 
代码 
    private void CheckNode(DevExpress.XtraTreeList.Nodes.TreeListNode node)
          {
              foreach (DevExpress.XtraTreeList.Nodes.TreeListNode cnode in node.Nodes)
              {
                  if (cnode != null)
                  {
                      cnode.CheckState CheckState.Checked;
                   }
                  if (cnode.HasChildren)
                 {
                     CheckNode(cnode);
                 }
            }
         }
代码
        /// 
        /// 
        /// 
        /// 
        private void ValidParentIsChecked(DevExpress.XtraTreeList.Nodes.TreeListNode node)
        {
            if (node.ParentNode != null)
            {
     if(node.ParentNode.CheckState!=CheckState.Checked)
                node.ParentNode.CheckState CheckState.Indeterminate;
                ValidParentIsChecked(node.ParentNode);
            }
        }
       代码
        private void ValidParentNodeIsCanleSel(DevExpress.XtraTreeList.Nodes.TreeListNode node)
        {
            bool isSel false;
            if (node.ParentNode != null)
            {
                if (node.ParentNode.CheckState == CheckState.Indeterminate)
                {//如果父节点的 状态为 半选 状态 这 更具父节点 判断子节点是否打钩
                    isSel ValidIsHasCheckChildNode(node.ParentNode);
                    if (isSel == false)
                    {//如果所有的 子节点 都没有 “选中”那么 父节点的状态 变为 非选中状态
                        node.ParentNode.CheckState CheckState.Unchecked;
                    }
                }
                ValidParentNodeIsCanleSel(node.ParentNode);
            }
        }
        /// 
        /// 判断 子节点 是否 有 状态为 “选中”状态 
        /// true 表示有 false 表示为 没有
        /// 
        /// 
        /// 
        private bool ValidIsHasCheckChildNode(DevExpress.XtraTreeList.Nodes.TreeListNode node)
        {
            bool isCheck false;
            foreach (DevExpress.XtraTreeList.Nodes.TreeListNode cnode in node.Nodes)
            {
                if (cnode != null)
                {
                    if (cnode.CheckState == CheckState.Checked)
                    {
                        isCheck true;
                        return isCheck;
                    }
                }
                if (cnode.HasChildren)
                {
                    isCheck ValidIsHasCheckChildNode(cnode);
                    if (isCheck == true)
                    {
                        return isCheck;
                    }
                }
            }
            return isCheck;
        

五、通过treelist的 node节点 可以得到当前节点对应的行

 System.Data.DataRowView rov = treeList1.GetDataRecordByNode(node) as System.Data.DataRowView;

六、如果想让treelist的check框不可编辑,我用到的办法是:在“BeforeCheckNode”这个事件中给出判断

  private void treeList1_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e)
        {
            //验证并判断 treelist 是否可编辑(默认的可编辑的) ---2010/09/06上海修改
            if (ValidOrgTreeIsEdit == false)
                e.CanCheck = false;
            else
            {
                e.CanCheck = true;
            }
            
        }

七、如果想 一个 node 绑定是 name 字段,但是显示为:code+name 可以在(CustomDrawNodeCell)这个事件中写方法
代码
private void TreeCat_CustomDrawNodeCell(object sender, DevExpress.XtraTreeList.CustomDrawNodeCellEventArgs e)
        {
            if (e.CellValue == null) return;
            if (e.Node == null) return;
            if (e.Column.Equals(name))
            {
                if (e.CellValue.ToString().Trim() != string.Empty)
                {
                    System.Data.DataRowView rov treeList1.GetDataRecordByNode(e.Node) as System.Data.DataRowView;
                    if (rov != null)
                    {
                        e.CellText rov["code"].ToString().Trim() rov["name"].ToString().Trim();
                    }
                }
            }
        }

以上就是目前对treelist的一些基本操作。主要是用到递归方法实现对节点的控制。

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有