C#发现之旅 - 高性能ASP.NET树状列表控件(下)
2010-09-30 21:03:02 来源:WEB开发网在这个函数中,首先连接程序目录下的演示数据库 SkyDemo.mdb,然后执行一个比较复杂的SQL查询,获得数据库中所有的客户名称,订单信息和订单货物信息,然后填充到myTreeView的Nodes属性中,从而在内存中构造了一个三层的树状结构。
这里面可以看到树状列表没有自动的数据源绑定功能。由于树状结构处理过程复杂,简单的数据源绑定难于实现,因此这个树状列表控件不提供数据源绑定功能,而是需要使用者编程向列表添加节点。
填充第一个树状列表后,程序然后再次查询数据库,获得所有的客户名称和编号,然后填充到myTreeView2 的Nodes中,并设置每个节点的XMLSource属性。而XMLSource属性就规定了客户端动态加载子节点使用的XML文档的URL地址。这里使用了另外一个页面“TreeViewNodeXml.aspx”作为XML文档的提供者,并向该页面传递参数来决定生成什么样的节点定义XML文档。而且该页面生成的XML文档格式符合刚才设计的节点XML文档格式。
在这个页面中,没有任何生成HTML代码的代码,所做的只是向页面拖拽放置树状列表,然后查询数据库填充控件的节点结构,可以说使用比较方便,这个树状列表控件内部自动完成了所有的底层工作。
TreeViewNodeXml.aspx
本页面是一个后台服务页面,用于向第二个树状列表动态的提供子节点信息。该页面也不复杂,它没有HTML代码,其ASPX文件只有一行代码,其代码如下
<%@ Page language="c#" Inherits="CS_Discovery.TreeViewNodeXml" CodeFile="TreeViewNodeXml.aspx.cs" %>
查看该页面的C#代码,只有一个Page_Load函数,其代码为
protected void Page_Load(object sender, System.EventArgs e)
{
// 关键字的类型
string KeyType = this.Request.QueryString["KeyType"] ;
// 关键字的数值
string KeyValue = this.Request.QueryString["KeyValue"];
// 设置页面输出格式
this.Response.ContentEncoding = System.Text.Encoding.GetEncoding( 936 );
this.Response.ContentType = "text/xml";
// 根据页面输出流创建XML文档书写器
System.Xml.XmlTextWriter writer = new System.Xml.XmlTextWriter( this.Response.Output );
// 设置带缩进
writer.IndentChar = ' ' ;
writer.Indentation = 3;
writer.Formatting = System.Xml.Formatting.Indented ;
// 开始输出XML文档
writer.WriteStartDocument();
writer.WriteStartElement("Nodes");
// 连接数据库
using( System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection())
{
conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ this.Server.MapPath("SkyDemo.mdb");
conn.Open();
// 查询数据库
using( System.Data.OleDb.OleDbCommand cmd = conn.CreateCommand())
{
if (KeyType == "customerid")
{
// 关键字为客户编号,则此时查询该客户编号下的所有的订单信息
cmd.CommandText = "select orderid , shipname from orders where customerid='"
+ KeyValue +"' order by orderid";
System.Data.IDataReader reader = cmd.ExecuteReader();
while( reader.Read())
{
writer.WriteStartElement("Node");
string NodeID = System.Guid.NewGuid().ToString();
// 创建节点编号
writer.WriteElementString("ID" , NodeID );
writer.WriteElementString("Icon","order.bmp");
// 节点文本就是订单编号和订单人姓名
writer.WriteElementString("Text" ,
Convert.ToString( reader.GetValue( 0 ) )
+ "-" + Convert.ToString( reader.GetValue( 1 )));
// 输出生成子节点使用的XML文档URL地址,从功能上看相当于递归调用本页面
writer.WriteElementString("XMLSource" ,
"TreeViewNodeXml.aspx?KeyType=orderdetails&KeyValue="
+ Convert.ToString( reader.GetValue( 0 )) );
writer.WriteEndElement();
}
reader.Close();
}
else if( KeyType == "orderdetails" )
{
// 关键字为订单编号,则此时查询该订单编号下的所有的货物的信息
cmd.CommandText = @"
Select
products.productname ,
orderdetails.quantity
from
orderdetails ,
products
where
orderdetails.productid = products.productid
and orderdetails.orderid=" + KeyValue + " order by productname ";
System.Data.IDataReader reader = cmd.ExecuteReader();
while( reader.Read())
{
writer.WriteStartElement("Node");
string NodeID = System.Guid.NewGuid().ToString();
writer.WriteElementString("ID" , NodeID );
writer.WriteElementString("Icon" , "product.bmp" );
writer.WriteElementString("Text" ,
Convert.ToString( reader.GetValue( 0 )));
writer.WriteElementString("OnClick" ,
"alert('" + Convert.ToString( reader.GetValue( 0 )) + "')" );
writer.WriteEndElement();
}
reader.Close();
}
}//using
}//using
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Close();
}
更多精彩
赞助商链接