• 借鉴ANJOU的方法改写了上次的TreeView


     TreeView 是一个很好的表达树形结构的控件。如果要加载的数据比较多的话,就需要逐层加载数据。要实现逐层加载数据,首先想到的就是TreeView 的 BeforeExpand 事件,它在节点展开前触发。但问题是BeforeExpand 事件每次展开时都会触发。有没有只在首次展开才触发的事件呢,可惜没找到。没关系,我们自定义一个 TreeView 节点类,给它加一个是否首次被展开的属性。
           /// <summary>
            
    /// 自定义节点类,继承于系统的 TreeNode 类,给节点增加一个 IsFirstExpand 属性
            
    /// </summary>
            public class InheritTreeNode : TreeNode
            {
                
    private bool isFirstExpand = true;

                
    public bool IsFirstExpand //属性
                {
                    
    get { return isFirstExpand; }
                    
    set { isFirstExpand = value; }
                }

                
    public InheritTreeNode() : base() { }
                
    public InheritTreeNode(string text) : base(text) { }
            }
    下面是一个加载省市的完整代码:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Data.SqlClient;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace test
    {
        
    public partial class TreeStruc : Form
        {
            
    public TreeStruc()
            {
                InitializeComponent();
            }

            SqlConnection conn 
    = new SqlConnection("server=zhuzy;integrated security=sspi;database=library");
            SqlDataAdapter da;
            DataSet ds
    =new DataSet();

            
    /// <summary>
            
    /// 自定义节点类,继承于系统的 TreeNode 类,给节点增加一个 IsFirstExpand 属性
            
    /// </summary>
            public class InheritTreeNode : TreeNode
            {
                
    private bool isFirstExpand = true;

                
    public bool IsFirstExpand //属性
                {
                    
    get { return isFirstExpand; }
                    
    set { isFirstExpand = value; }
                }

                
    public InheritTreeNode() : base() { }
                
    public InheritTreeNode(string text) : base(text) { }
            }

            
    string id = "";
            
    private void Tree_Load(object sender, EventArgs e)
            {
                da 
    = new SqlDataAdapter("select province_id,province_name from province", conn);
                da.Fill(ds, 
    "province");
                
    for (int i = 0; i < ds.Tables["province"].Rows.Count; i++)
                {
                    InheritTreeNode root 
    = new InheritTreeNode(ds.Tables["province"].Rows[i][1].ToString().Trim());
                    id 
    = ds.Tables["province"].Rows[i][0].ToString().Trim();
                    
    this.treeView1.Nodes.Add(root);
                    AddChileNode(root);
                    id 
    = "";//
                }
            }

            
    /// <summary>
            
    /// 添加 node 的子节点
            
    /// </summary>
            private void AddChileNode(TreeNode node)
            {
                da 
    = new SqlDataAdapter("select city_name from city where province_id='" + id + "'", conn);
                da.Fill(ds, 
    "city");
                
    try
                {
                    
    for (int j = 0; j < ds.Tables["city"].Rows.Count; j++)
                    {
                        node.Nodes.Add(
    new InheritTreeNode(ds.Tables["city"].Rows[j][0].ToString().Trim()));
                    }
                }
                
    catch { }
                ds.Tables[
    "city"].Clear();//
            }

            
    /// <summary>
            
    /// 节点展开之前事件
            
    /// </summary>
            private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
            {
                InheritTreeNode node 
    = (InheritTreeNode)e.Node;//获取要选中、展开、折叠或选择的树节点e.Node

                
    if (node != null)
                {
                    
    // 判断该节点是否首次被展开
                    if (node.IsFirstExpand)
                    {
                        
    for (int i = 0; i < node.Nodes.Count; i++)
                        {
                            AddChileNode(node.Nodes[i]); 
    // // 为 e.Node 下的每个子节点,添加子节点
                        }
                    }
                }
                node.IsFirstExpand 
    = false;
            }
        }
    }

    结果:
  • 相关阅读:
    柔性数组
    2015阿里秋招当中一个算法题(经典)
    LAMP环境搭建
    JS和JQuery中的事件托付 学习笔记
    #17 Letter Combinations of a Phone Number
    码农生涯杂记_5
    【C++ Primer每日刷】之三 标准库 string 类型
    扎根本地连接未来 千米网的电商“红海”生存术
    poj 3356
    经验之谈—OAuth授权流程图
  • 原文地址:https://www.cnblogs.com/perfect/p/605917.html
Copyright © 2020-2023  润新知