TreeView 是一个很好的表达树形结构的控件。如果要加载的数据比较多的话,就需要逐层加载数据。要实现逐层加载数据,首先想到的就是TreeView 的 BeforeExpand 事件,它在节点展开前触发。但问题是BeforeExpand 事件每次展开时都会触发。有没有只在首次展开才触发的事件呢,可惜没找到。没关系,我们自定义一个 TreeView 节点类,给它加一个是否首次被展开的属性。
///<summary>
///自定义节点类,继承于系统的TreeNode类,给节点增加一个IsFirstExpand属性
///</summary>
publicclassInheritTreeNode:TreeNode
{
privateboolisFirstExpand=true;
publicboolIsFirstExpand//属性
{
get{returnisFirstExpand;}
set{isFirstExpand=value;}
}
publicInheritTreeNode():base(){}
publicInheritTreeNode(stringtext):base(text){}
}
下面是一个加载省市的完整代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Data.SqlClient;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
namespacetest
{
publicpartialclassTreeStruc:Form
{
publicTreeStruc()
{
InitializeComponent();
}
SqlConnectionconn=newSqlConnection("server=zhuzy;integratedsecurity=sspi;database=library");
SqlDataAdapterda;
DataSetds=newDataSet();
///<summary>
///自定义节点类,继承于系统的TreeNode类,给节点增加一个IsFirstExpand属性
///</summary>
publicclassInheritTreeNode:TreeNode
{
privateboolisFirstExpand=true;
publicboolIsFirstExpand//属性
{
get{returnisFirstExpand;}
set{isFirstExpand=value;}
}
publicInheritTreeNode():base(){}
publicInheritTreeNode(stringtext):base(text){}
}
stringid="";
privatevoidTree_Load(objectsender,EventArgse)
{
da=newSqlDataAdapter("selectprovince_id,province_namefromprovince",conn);
da.Fill(ds,"province");
for(inti=0;i<ds.Tables["province"].Rows.Count;i++)
{
InheritTreeNoderoot=newInheritTreeNode(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>
privatevoidAddChileNode(TreeNodenode)
{
da=newSqlDataAdapter("selectcity_namefromcitywhereprovince_id='"+id+"'",conn);
da.Fill(ds,"city");
try
{
for(intj=0;j<ds.Tables["city"].Rows.Count;j++)
{
node.Nodes.Add(newInheritTreeNode(ds.Tables["city"].Rows[j][0].ToString().Trim()));
}
}
catch{}
ds.Tables["city"].Clear();//
}
///<summary>
///节点展开之前事件
///</summary>
privatevoidtreeView1_BeforeExpand(objectsender,TreeViewCancelEventArgse)
{
InheritTreeNodenode=(InheritTreeNode)e.Node;//获取要选中、展开、折叠或选择的树节点e.Node
if(node!=null)
{
//判断该节点是否首次被展开
if(node.IsFirstExpand)
{
for(inti=0;i<node.Nodes.Count;i++)
{
AddChileNode(node.Nodes[i]);////为e.Node下的每个子节点,添加子节点
}
}
}
node.IsFirstExpand=false;
}
}
}
结果:
分享到:
相关推荐
HYPERLINK"http://www.cnblogs.com/anjou/archive/2008/02/04/1064606.html"TP-LINK无线路由器+花生壳+Serv-U配置FTP服务器一、安装Serv-U二、配置Serv-U1. 打开Serv-UAdministrator。2. 建立FTP域 选择Serv-U...
8. Rosé d'Anjou(安茹玫瑰红)的主要葡萄品种是Grolleau,这种葡萄在法国卢瓦尔河谷地区常用于酿造红葡萄酒和玫瑰葡萄酒。 9. 中部西班牙的气候特点:大陆性气候,降雨量低,表现为高温低湿。 10. 澳大利亚的 ...
backgroundWorker 和 PerformanceCounter https://www.cnblogs.com/anjou/p/9593537.html propertygrid https://www.cnblogs.com/greatverve/archive/2010/10/26/csharp-propertygrid.html Windows 安装服务 安装...
2014年在1942年法国抵抗运动地图的私人档案中的发现显示了缅因州右侧的进一步德国军事结构以及在圣巴泰勒米d'Anjou拉勒市的一个大型掩体的计划,迫使该研究得以恢复。关于昂热地区的德国军事机构。 昂热地区从第二...
模拟集成电路 代码