软件编程
位置:首页>> 软件编程>> C#编程>> Devexpress treelist 简介

Devexpress treelist 简介

作者:一枚水  发布时间:2023-02-13 23:07:56 

标签:devexpress,treelist

节点折叠 this.treeList1.CollapseAll();

  一、简介

二、属性列表

1、OptionsSelection:

  EnableAppearanceForcusedCell:选中的Cell的Appearance设置是否可用。默认为True;

  EnableAppearanceForcusedRow:选中的Node的Appearance设置是否可用。默认为True

  InvertSelection:设置选中风格是只应用于选中的Cell,还是应用于除选中的Cell之外的所有Cell。默认为False,即后者; 

  MultiSelect:是否可以选择多个Node。默认为False。

2、OptionsView:

   AutoCalcPreviewLineCount:是否自动计算预览节段的高度。默认为True;

   AutoWidth:是否允许列自动调整宽度;默认为True;

   EnableAppearanceEvenRow:生成偶数Node时,是采用由

  TreeListAppearanceCollection.EvenRow属性提供的Appearance

    设置,还是采用由TreeListAppearanceCollection.Row提供的

   Appearance设置。默认为False,即后者;

   EnableAppearanceOddRow:生成奇数Node时,是采用由

  TreeListAppearanceCollection.OddRow属性提供的Appearance

    设置,还是采用由TreeListAppearanceCollection.Row提供的

   Appearance设置。默认为False,即后者;

   ShowButtons:是否显示展开与收缩按钮。默认为True;

   ShowCloumns:是否显示列标题。默认为True;

   ShowFocusedFrame:在获得焦点的Cell上,是否显示焦点框架。默认为True;

   ShowHorzLines:是否显示水平线。默认为True;

   ShowIndentAsRowStyle:是否用相应Node的Appearance设置来生成Tree的缩进。默认为False

   ShowIndicator:是否显示Node的指示符面板。默认为True;

  ShowPreview:是否显示预览节段。默认为False;

  ShowRoot:是否在根Node间显示连接线。默认为True;

   ShowRowFooterSummary:是否显示分组脚注。默认为False;

  ShowSummaryFooter:是否显示摘要脚注。默认为False;

  ShowVertLines:是否显示垂直线。默认为True;

3、SelectImageList:选中Node时,显示图片的列表;

4、StateImageList:指明Node状态的图片的列表;

三、事件

四、使用

1、 如何隐藏TreeList的列头

   设置TreeListr的OptionsView的ShowColumns属性为:False

2、 如何默认展开所有的节点ExpandAll()

   tlvWells.ExpandAll();

    以及TreeNode.Expand   =   false  

    或者你可以控制展开的层数 reeView1.ExpandLevel=10; 展开10层

  this.treeList.Nodes[0].ExpandAll();// 第一层下的所有接点展开

3、 如何让TreeList的每个结点高亮显示?

代码如下:


private void treeList1_CustomDrawNodeCell(object sender, DevExpress.XtraTreeList.CustomDrawNodeCellEventArgs e)
   {
     TreeList node = sender as TreeList;
     if (e.Node == node.FocusedNode)
     {
       e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds);
       Rectangle r = new Rectangle(e.EditViewInfo.ContentRect.Left, e.EditViewInfo.ContentRect.Top,
       Convert.ToInt32(e.Graphics.MeasureString(e.CellText,  treeList1.Font).Width + 1), Convert.ToInt32(e.Graphics.MeasureString(e.CellText,treeList1.Font).Height));
       e.Graphics.FillRectangle(SystemBrushes.Highlight, r);
       e.Graphics.DrawString(e.CellText, treeList1.Font, SystemBrushes.HighlightText, r);
       e.Handled = true;
     }
   }

4、 数据绑定最基本的两个属性:KeyFieldName和ParentFieldName。

(这两个属性一设置就基本上可以实现分级了)可以通过代码的编写实现,也可以直接在属性里面直接实现。这种数据库设计是比较常见的,一般数据满足树形关系就可以这样设计。绑定数据时,只需指定DataSource为对应 的DataTable,指定KeyFieldName为表主键字段,ParentFieldName为表指向主键的外键字段名。


private void BindData()
     {
     this.tlOffice.DataSource = dtOffice;
     tlOffice.KeyFieldName = "OfficeID";
     //tlOffice.DataMember = "OfficeName";
     tlOffice.Columns["OfficeName"].Caption = "局名称";
     tlOffice.ParentFieldName = "ParentOfficeID";
   }

5、 选择某一节点时,该节点的子节点全部选择  取消某一节点时,该节点的子节点全部取消选择

      哪个节点引起行为的?节点是选中还是取消选中?由此确定方法的两个参数:TreeListNode和CheckState。遍历该节点及其子孙,并将其选中状态设置为该节点的状态即可。


   /// 选择某一节点时,该节点的子节点全部选择 取消某一节点时,该节点的子节点全部取消选择
   /// <param name="node"></param>
   /// <param name="state"></param>
   private void SetCheckedChildNodes(TreeListNode node, CheckState check)
   {
     for (int i = 0; i < node.Nodes.Count; i++)
     {
       node.Nodes[i].CheckState = check;
       SetCheckedChildNodes(node.Nodes[i], check);
     }
 }

上两步写好了,别忘了上面的两个方法在TreeList_AfterCheckNode里面触发:


private void tlOffice_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
{
 SetCheckedChildNodes(e.Node, e.Node.CheckState);
 SetCheckedParentNodes(e.Node, e.Node.CheckState);
}

6、 某节点的子节点全部选择时,该节点选择;某节点的子节点未全部选择时,该节点不选择     


/// 某节点的子节点全部选择时,该节点选择  某节点的子节点未全部选择时,该节点不选择
   /// <param name="node"></param>
   /// <param name="check"></param>
   private void SetCheckedParentNodes(TreeListNode node, CheckState check)
   {
     if (node.ParentNode != null)
     {
       CheckState parentCheckState = node.ParentNode.CheckState;
       CheckState nodeCheckState;
       for (int i = 0; i < node.ParentNode.Nodes.Count; i++)
       {
         nodeCheckState = (CheckState)node.ParentNode.Nodes[i].CheckState;
         if (!check.Equals(nodeCheckState))//只要任意一个与其选中状态不一样即父节点状态不全选
         {
           parentCheckState = CheckState.Unchecked;
           break;
         }
         parentCheckState = check;//否则(该节点的兄弟节点选中状态都相同),则父节点选中状态为该节点的选中状态
       }
       node.ParentNode.CheckState = parentCheckState;
       SetCheckedParentNodes(node.ParentNode, check);//遍历上级节点
     }
   }

 上两步写好了,别忘了上面的两个方法在TreeList_AfterCheckNode里面触发: 


private void tlOffice_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
   {
     SetCheckedChildNodes(e.Node, e.Node.CheckState);
     SetCheckedParentNodes(e.Node, e.Node.CheckState);
   }

7、 获取选中的复选框数据列表


private List<int> lstCheckedOfficeID = new List<int>();//选择局ID集合
   /// 获取选择状态的数据主键ID集合
   /// <param name="parentNode">父级节点</param>
   private void GetCheckedOfficeID(TreeListNode parentNode)
   {
     if (parentNode.Nodes.Count == 0)
     {
       return;//递归终止
     }
     foreach (TreeListNode node in parentNode.Nodes)
     {
       if (node.CheckState == CheckState.Checked)
       {
         DataRowView drv = tlOffice.GetDataRecordByNode(node) as DataRowView;//关键代码,就是不知道是这样获取数据而纠结了很久(鬼知道可以转换为DataRowView啊)
         if (drv != null)
         {
           int OfficeID = (int)drv["OfficeID"];
           lstCheckedOfficeID.Add(OfficeID);
         }
       }
       GetCheckedOfficeID(node);
     }
   }

  下面测试获取主键列表:


private void btnCheck_Click(object sender, EventArgs e)
   {
     this.lstCheckedOfficeID.Clear();
     if (tlOffice.Nodes.Count > 0)
     {
       foreach (TreeListNode root in tlOffice.Nodes)
       {
         GetCheckedOfficeID(root);
       }
     }
     string idStr = string.Empty;
     foreach (int id in lstCheckedOfficeID)
     {
       idStr += id + " ";
     }
     MessageBox.Show(idStr);
   }

五、注意事项

1、从数据库中读取数据

方法一:直接点击控件

 这种方法连接后系统会自动生成一行代码:


this. 数据库表名TableAdapter.Fill(this.dataDataSet4.数据库表名);

 这种方法生成后不会像写代码那样连接后就会把第一行默认为根节点。而且一旦你要把可执行文件拿走就不可用了。因为你在选择数据库的时候选的是绝对路径。所以最好用下面的方法。

方法二:

用代码连接数据库(写的代码方法很多)       


String connectionString = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=";
     connectionString += @"D:\Data.mdb";//这用的是绝对路径

应该用相对路径。


(String connectionString = @"Provider=Microsoft.Jet.OleDb.4.0;Data Source=";
     connectionString += Application.StartupPath + @"\Data.mdb";

     System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(connectionString);
     con.Open();
     System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand("SELECT * FROM FS_STAFF", con);
     System.Data.OleDb.OleDbDataReader reader = cmd.ExecuteReader();
     DataTable table = new DataTable();
     table.Load(reader);
     gridControl2.DataSource = table;

好了,以上内容是小编给大家简单介绍的Devexpress treelist 知识,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

来源:http://www.cnblogs.com/yimeishui/articles/5759810.html

0
投稿

猜你喜欢

  • 最近几个项目的测试结果,Android无法主动通过调用 webview.loadUrl("javascript:"+ca
  • 问题用过storm或者jstorm的都知道,如果在bolt代码中发生了没被catch住的异常,所在worker进程会退出。本文就从源码角度分
  • 本文实例为大家分享了spring aop注解配置的具体代码,供大家参考,具体内容如下Demo.javapackage cn.itcast.e
  • 理解C#中的闭包1、 闭包的含义首先闭包并不是针对某一特定语言的概念,而是一个通用的概念。除了在各个支持函数式编程的语言中,我们会接触到它。
  • 目录前言Java Heap进程内存分配内存不足管理GC 垃圾回收内核交换守护进程低内存终止守护进程最后前言很高兴遇见你~内存优化一直是 An
  • 一、TPHTable Per Hierarchy (默认,每个层次一个表)每个层次结构共用一个表,类的每一个属性都必须是可空的。1、默认行为
  • 1、首先创建一个测试实体类Person,并携带如上注解,其注解的作用描述在messagepackage com.clickpaas.pojo
  • 本文实例为大家分享了Java实现答答租车系统的具体代码,供大家参考,具体内容如下项目需求: 基本界面需求:and:最后是把账单打印出来:个人
  • 一、默认异常处理机制默认情况下,SpringBoot 提供 /error 请求,来处理所有异常的。1.浏览器客户端,请求头里的属性是Acce
  • 我们开发一个Spring Boot项目,肯定要导入许多的静态资源,比如css,js等文件如果我们是一个web应用,我们的main下会有一个w
  • 一:回顾(1)c++中的string类是在面试中和笔试中经常考的题目; 工程代码免费下载 string类的自行实现(2)c++中的strin
  • 第一节 接口慨述接口(interface)用来定义一种程序的协定。实现接口的类或者结构要与接口的定义严格一致。有了这个协定,就可以抛开编程语
  • 常量是固定值,程序执行期间不会改变。常量可以是任何基本数据类型,比如整数常量、浮点常量、字符常量或者字符串常量,还有枚举常量。常量可以被当作
  • 前言关于RecyclerView的使用这里就不在赘述了,相信网上一搜一大把(本人之前的文章也有简单的使用介绍),这次我们讲的是Recycle
  • 一、Shader基础知识1.1、什么是Shader在讲什么是Shader之前我们先看看下面两段代码 这两段代码实现的功能都是提取
  • 在Java中创建一个线程有两种方法:继承Thread类和实现Runnable接口。下面通过两个例子来分析两者的区别:1)继承Thread类p
  • 实例如下:package com.huad.luck;import java.util.ArrayList;import java.util
  • Windows系统启动Java程序会弹出黑窗口。黑窗口有几点不好。首先它不美观;其次容易误点导致程序关闭;但最让我匪夷所思的是:将鼠标光标选
  • 本文实例为大家分享了android UI绘制加减号按钮的具体代码,供大家参考,具体内容如下在项目中我们常常会用到这么一个view。这时候我们
  • 微信公众号开发一般是针对企业和组织的,个人一般只能申请订阅号,并且调用的接口有限,下面我们就来简单的描述下接入公众号的步骤:1、首先你需要一
手机版 软件编程 asp之家 www.aspxhome.com