zoukankan      html  css  js  c++  java
  • Devexpress WinForm TreeList的三种数据绑定方式(DataSource绑定、AppendNode添加节点、VirtualTreeGetChildNodes(虚拟树加载模式))

    第一种:DataSource绑定,这种绑定方式需要设置TreeList的ParentFieldName和KeyFieldName两个属性,这里需要注意的是KeyFieldName的值必须是唯一的。

    代码如下:

     private void Form1_Load(object sender, EventArgs e)
            {
                try
                {
                    //构建一个DataTable数据源
                    DataTable table = new DataTable();
                    table.Columns.Add("parentId");
                    table.Columns.Add("Id");
                    table.Columns.Add("parentName");
                    table.Columns.Add("Name");
                    DataRow row = table.NewRow();
                    row["parentId"] = "";
                    row["Id"] = "*";
                    row["Name"] = "所有颜色";
                    table.Rows.Add(row);
                    row = table.NewRow();
                    row["parentId"] = "*";
                    row["Id"] = "1";
                    row["Name"] = "红色";
                    table.Rows.Add(row);
                    row = table.NewRow();
                    row["parentId"] = "*";
                    row["Id"] = "2";
                    row["Name"] = "黄色";
                    table.Rows.Add(row);
                    row = table.NewRow();
                    row["parentId"] = "*";
                    row["Id"] = "3";
                    row["Name"] = "绿色";
                    table.Rows.Add(row);
                    row = table.NewRow();
                    row["parentId"] = "1";
                    row["Id"] = "01";
                    row["Name"] = "粉红色";
                    table.Rows.Add(row);
                    row = table.NewRow();
                    row["parentId"] = "2";
                    row["Id"] = "02";
                    row["Name"] = "鹅黄色";
                    table.Rows.Add(row);
                    treeList1.ParentFieldName = "parentId";
                    treeList1.KeyFieldName = "Id";
                    treeList1.DataSource = table;
                    treeList1.ExpandAll();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    
            private void treeList1_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e)
            {
                e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked);
            }
    
            private void treeList1_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
            {
                try
                {
                    SetCheckedChildNodes(e.Node, e.Node.CheckState);
                    SetCheckedParentNodes(e.Node, e.Node.CheckState);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    
            /// <summary>
            /// 设置子节点的状态
            /// </summary>
            /// <param name="node"></param>
            /// <param name="check"></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);
                }
            }
    
            /// <summary>
            /// 设置父节点的状态
            /// </summary>
            /// <param name="node"></param>
            /// <param name="check"></param>
            private void SetCheckedParentNodes(TreeListNode node, CheckState check)
            {
                if (node.ParentNode != null)
                {
                    bool b = false;
                    CheckState state;
                    for (int i = 0; i < node.ParentNode.Nodes.Count; i++)
                    {
                        state = (CheckState)node.ParentNode.Nodes[i].CheckState;
                        if (!check.Equals(state))
                        {
                            b = !b;
                            break;
                        }
                    }
                    node.ParentNode.CheckState = b ? CheckState.Checked : check;
                    SetCheckedParentNodes(node.ParentNode, check);
                }
            }

    运行效果图:

     第二种:AppendNode添加节点

    代码如下:

            private void LoadTree()
            {
                //清空节点
                treeList1.BeginUnboundLoad();
                treeList1.ClearNodes();
                arrayList = new List<TreeListNode>();
                //绑定部位树树的第一层
                TreeListNode Node = treeList1.Nodes.Add(new object[] { "所有颜色", "*"});
                Node.Tag = "*";
                arrayList.Add(Node);
                //绑定第二层
                DataSet ds = SqlHelper.Query(@"select ctc.colorId as ParentNodeID,ctc.childcolorId as NodeID, cc.names as NodeName
                from C_colorTocolor ctc(nolock)
                inner join C_color cc(nolock) on ctc.childcolorId=cc.id");
                if (ds != null && ds.Tables.Count > 0)
                {
                    table = ds.Tables[0];
                    DataRow[] rows = table.Select("ParentNodeID='*'");
                    foreach (DataRow row in rows)
                    {
                        TreeListNode tn = treeList1.AppendNode(new object[] { row["NodeName"].ToString(), row["NodeID"].ToString() }, Node.Id);
                        tn.Tag = row["NodeID"].ToString();
                        arrayList.Add(tn);
                        BindNode(row["NodeID"].ToString(), tn);
                    }
                }
                treeList1.EndUnboundLoad();
                treeList1.ExpandAll();
            }
    
            private void BindNode(string nodeId, TreeListNode tn)
            {
                DataRow[] rows = table.Select("ParentNodeID='" + nodeId + "'");
                foreach (DataRow row in rows)
                {
                    TreeListNode tns = treeList1.AppendNode(new object[] { row["NodeName"].ToString(), row["NodeID"].ToString()}, tn.Id);
                    tns.Tag = row["NodeID"].ToString();
                    arrayList.Add(tns);
                    BindNode(row["NodeID"].ToString(), tns);
                }
            }
    
            private void Form2_Load(object sender, EventArgs e)
            {
                //绑定树
                LoadTree();
            }
    

    运行效果图:

     第三种:VirtualTreeGetChildNodes虚拟树加载。这种模式主要用于数据量过多,打开界面比较慢的情况。

    private void Form3_Load(object sender, EventArgs e)
            {
                //初始化树
                InitData();
            }
    
            bool isload = false;
            void InitData()
            {
                isload = false;
                treeList1.ClearNodes();
                treeList1.DataSource = new object();
            }
    
            private void treeList1_VirtualTreeGetChildNodes(object sender, DevExpress.XtraTreeList.VirtualTreeGetChildNodesInfo e)
            {
                Cursor current = Cursor.Current;
                Cursor.Current = Cursors.WaitCursor;
                if (!isload)
                {
                    List<O_node> roots = new List<O_node> { new O_node() { id= "*", names= "所有颜色",parentid="" } };
                    e.Children = roots;
                    isload = true;
                }
                else
                {
                    try
                    {
                        O_node on = e.Node as O_node;
                        if(on!=null)
                        {
                            string sql = string.Format(@"select ctc.colorId as parentid,ctc.childcolorId as id, cc.names as names
                            from C_colorTocolor ctc(nolock)
                            inner join C_color cc(nolock) on ctc.childcolorId = cc.id
                            where ctc.colorId = '{0}'", on.id);
                            DataSet ds  = SqlHelper.Query(sql);
                            if (ds != null && ds.Tables.Count > 0)
                            {
                                List<O_node> lst = (List<O_node>)DataTableToList<O_node>(ds.Tables[0]);
                                e.Children = lst;
                            }
                            else
                            {
                                e.Children = new object[] { };
                            }
                        }
                        else
                        {
                            e.Children = new object[] { };
                        }
                    }
                    catch
                    {
                        e.Children = new object[] { };
                    }
                }
                Cursor.Current = current;
            }
    
            private void treeList1_VirtualTreeGetCellValue(object sender, DevExpress.XtraTreeList.VirtualTreeGetCellValueInfo e)
            {
                string name = string.Empty;
                if (e.Node is O_node)
                {
                    name = (e.Node as O_node).names;
                }
                if (e.Column == treeListColumn1) e.CellData = name;
            }
    
            public static IList<T> DataTableToList<T>(DataTable table)
                where T : class
            {
                if (!IsHaveRows(table))
                    return new List<T>();
                IList<T> list = new List<T>();
                T model = default(T);
                foreach (DataRow dr in table.Rows)
                {
                    model = Activator.CreateInstance<T>();
                    foreach (DataColumn dc in dr.Table.Columns)
                    {
                        object drValue = dr[dc.ColumnName];
                        PropertyInfo pi = model.GetType().GetProperty(dc.ColumnName);
                        if (pi != null && pi.CanWrite && (drValue != null && !Convert.IsDBNull(drValue)))
                        {
                            pi.SetValue(model, drValue, null);
                        }
                    }
                    list.Add(model);
                }
                return list;
            }
    
            /// <summary>
            /// 检查DataTable 是否有数据行
            /// </summary>
            /// <param name="dt">DataTable</param>
            /// <returns></returns>
            public static bool IsHaveRows(DataTable dt)
            {
                if (dt != null && dt.Rows.Count > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
    
        #region 节点
        public class O_node
        {
            public string id { get; set; }
            public string names { get; set; }
            public string parentid { get; set; }
        }
        #endregion
    

    运行效果图:

    完整示例代码:https://download.csdn.net/download/u012026245/11986777

    csdn现在资源积分上传时都是固定积分为5分了,如果需要完整代码的可以去下载一下。

  • 相关阅读:
    Flutter Platform Channels
    catch socket error
    global position
    aria2 添加任务后一直在等待,不进行下载是什么情况?
    通知
    rename file
    长按弹菜单
    Linux命令行下如何终止当前程序?
    IOWebSocketChannel.connect handle errors
    writeAsBytes writeAsString
  • 原文地址:https://www.cnblogs.com/xiaomianyang/p/7268306.html
Copyright © 2011-2022 走看看