视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
TreeList
2025-10-05 01:23:43 责编:小OO
文档
TreeList

1、简介

2、属性列表

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状态的图片的列表;

3、事件

4、使用

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。遍历该节点及其子孙,并将其选中状态设置为该节点的状态即可。

   /// 

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

        /// 

        /// 

        /// 

        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、 某节点的子节点全部选择时,该节点选择;某节点的子节点未全部选择时,该节点不选择 

 /// 

        /// 某节点的子节点全部选择时,该节点选择   某节点的子节点未全部选择时,该节点不选择

        /// 

        /// 

        /// 

        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 lstCheckedOfficeID = new List();//选择局ID集合

           /// 

        /// 获取选择状态的数据主键ID集合

        /// 

        /// 父级节点

        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;下载本文

显示全文
专题