惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
NISL@THU
NISL@THU
E
Exploit-DB.com RSS Feed
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
K
Kaspersky official blog
Project Zero
Project Zero
Cisco Talos Blog
Cisco Talos Blog
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
S
Schneier on Security
G
GRAHAM CLULEY
The Hacker News
The Hacker News
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy & Cybersecurity Law Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
爱范儿
爱范儿
P
Privacy International News Feed
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
S
Securelist
G
Google Developers Blog
The Last Watchdog
The Last Watchdog
Google Online Security Blog
Google Online Security Blog
美团技术团队
F
Fortinet All Blogs
小众软件
小众软件
Recorded Future
Recorded Future
V
Visual Studio Blog
B
Blog RSS Feed
H
Help Net Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
Martin Fowler
Martin Fowler
Latest news
Latest news
Spread Privacy
Spread Privacy
H
Heimdal Security Blog

博客园 - tangdh

个人所得税速算扣除数是怎么算的? 个人所得税税率表一(工资、薪金所得适用)(2011年9月1日起执行) PB类库网址大全 pb 函数库-打印函数 PB Send()函数应用有关数据整理 PB 函数库-数据类型检查与转换函数 DataWindow的数据管理与更新机制的研究与应用 优化你的PB程序 - tangdh - 博客园 如何复制grid类型的所选择的行的数据到系统剪切板 PB 的 error.number 列表 - tangdh 在PowerBuilder的DataWindows.ItemChanged事件中修改当前单元格值的方法 PB开发境界 多个DW进行update sql 收藏 浪潮财务从一套帐备份到另一套帐 酒桌上的潜规则,男人必学,女人必知 excel个人所得税计算公式 全国大学FTP站列表 使用命令行IPSec封锁端口 pb11.2 转asp.net成功
[ASP.Net 2.0] TreeView只能用XML資料的解決之道
tangdh · 2006-03-25 · via 博客园 - tangdh
     

在前幾個章節所介紹的TreeView
([ASP.NET 2.0]SiteMapPath無法正確指到帶有QueryString的路徑
[ASP.NET 2.0]SiteMapPath WebControl)
有個限制(至少我覺得是限制),那就是只能使用XML的資料格式

但假如我們的資料是資料庫形式的資料該怎麼辦?

有兩個解決方法:一是自己寫程式,將節點加到TreeViewNode裡;一是另外寫個類似TreeViewNode的Class自己用
我是選第二個方法,這樣我就不用每次使用TreeView時,都要在寫那麼長一段程式碼了

先寫一個XmlTreeModel,程式碼如下:

C#:

  1. public class XmlTreeModel {

  2. #region Private Variable

  3. private int _indexid;

  4. private int _parentid;

  5. private string _title = string.Empty;

  6. private System.Collections.Generic.List<xmltreemodel> _childnodes = new System.Collections.Generic.List</xmltreemodel><xmltreemodel>();

  7. private XmlTreeModel _parent = null;

  8. private string _pathoftreeindex = string.Empty;

  9. private string _pathoftitle = string.Empty;

  10. private string _xmltag = string.Empty;

  11. private string _pathseparator = "/";   // 搭配TreeView.PathSeparator使用

  12. #endregion

  13. #region public enum XmlTreeModelPathType {...}

  14. public enum XmlTreeModelPathType {

  15.         PathOfTreeIndex = 0,

  16.         PathOfTitle = 1

  17. }

  18. #endregion

  19. #region Public Property

  20. public int IndexID { get { return _indexid; } }

  21. public int ParentID { get { return _parentid; } }

  22. public string Title { get { return _title; } }

  23. public System.Collections.Generic.List</xmltreemodel><xmltreemodel> ChildNodes { get { return _childnodes; } }

  24. public XmlTreeModel Parent { get { return _parent; } }

  25. public string XmlTagName { get { return _xmltag; } }

  26. public string PathSeparator {

  27.         get { return _pathseparator; }

  28.         set { _pathseparator = value; }

  29. }

  30. #endregion

  31. #region 多型 public XmlTreeModel()

  32. #region public XmlTreeModel(int indexid, string title) {...}

  33. public XmlTreeModel(int indexid, string title) {

  34.         _indexid = indexid;

  35.         _title = title;

  36.         _pathoftitle = title;

  37.         _pathoftreeindex = indexid.ToString();

  38.         _xmltag = _title.Replace(' ', '_');

  39. }

  40. #endregion

  41. #region public XmlTreeModel(int indexid, string title, string xmltagname) {...}

  42. public XmlTreeModel(int indexid, string title, string xmltagname) {

  43.         _indexid = indexid;

  44.         _title = title;

  45.         _pathoftitle = title;

  46.         _pathoftreeindex = indexid.ToString();

  47.         _xmltag = xmltagname;

  48. }

  49. #endregion

  50. #endregion

  51. #region public XmlTreeModel AppendChild(XmlTreeModel item) {...}

  52. public XmlTreeModel AppendChild(XmlTreeModel item) {

  53.         item._parent = this;

  54.         item._parentid = this._indexid;

  55.         item._pathseparator = this._pathseparator;

  56.         item._pathoftreeindex = this._pathoftreeindex + this._pathseparator + item._pathoftreeindex;

  57.         item._pathoftitle = this._pathoftitle + this._pathseparator + item._pathoftitle;

  58.         _childnodes.Add(item);

  59. return item;

  60. }

  61. #endregion

  62. #region 多型 public string ToXMLString()

  63. #region public string ToXMLString() {...}

  64. public string ToXMLString() {

  65. return ToXMLString(false);

  66. }

  67. #endregion

  68. #region public string ToXMLString(bool bInsCrLf) {...}

  69. public string ToXMLString(bool bInsCrLf) {

  70. string cr = (bInsCrLf) ? "\n" : "";

  71. string sXml = "< " + this._xmltag + " IndexID=\"" + this._indexid + "\" Title=\"" + this._title + "\"";

  72. if (this._childnodes.Count == 0) {

  73.             sXml += " />" + cr;

  74. } else {

  75.             sXml += ">" + cr;

  76. foreach (XmlTreeModel xtm in this._childnodes) {

  77. string nXml = xtm.ToXMLString(bInsCrLf);

  78.                 sXml += nXml;

  79. }

  80.             sXml += "" + cr;

  81. }

  82. return sXml;

  83. }

  84. #endregion

  85. #endregion

  86. #region public XmlTreeModel SearchNode(string treePath, XmlTreeModelPathType pt) {...}

  87. public XmlTreeModel SearchNode(string treePath, XmlTreeModelPathType pt) {

  88. string chkPath = string.Empty;

  89. switch (pt) {

  90. case XmlTreeModelPathType.PathOfTreeIndex:

  91.                 chkPath = this._pathoftreeindex;

  92. break;

  93. case XmlTreeModelPathType.PathOfTitle:

  94.                 chkPath=this._pathoftitle;

  95. break;

  96. default:

  97. break;

  98. }

  99. if (chkPath == treePath)

  100. return this;

  101. foreach (XmlTreeModel xtm in _childnodes) {

  102.             XmlTreeModel node = xtm.SearchNode(treePath, pt);

  103. if (node != null)

  104. return node;

  105. }

  106. return null;

  107. }

  108. #endregion

  109. }

在寫一個讀取資料庫的Class

C#:

  1. using System;

  2. using System.Configuration;

  3. using System.Data;

  4. using System.Data.SqlClient;

  5. public class QAManager {

  6.     XmlTreeModel Root;

  7. public string XmlString { get { return Root.ToXMLString(); } }

  8. public QAManager() { SetXmlTreeModel(); }

  9. #region private void SetXmlTreeModel() {...}

  10. private void SetXmlTreeModel() {

  11.         SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);

  12.         cn.Open();

  13.         SqlCommand cmd = new SqlCommand();

  14.         cmd.Connection = cn;

  15.         cmd.CommandType = CommandType.Text;

  16.         cmd.CommandText = "Select * From TB_QAClasses Order By DataPath";

  17.         SqlDataReader reader = cmd.ExecuteReader();

  18.         Root = new XmlTreeModel(0, "Q &amp; A", "Root");

  19. while (reader.Read()) {

  20. string path = (string)reader["DataPath"];

  21. string parentPath = path.Substring(0, path.LastIndexOf('/'));

  22.             XmlTreeModel xtm = Root.SearchNode(parentPath, XmlTreeModel.XmlTreeModelPathType.PathOfTreeIndex);

  23. if (xtm != null) {

  24.                 xtm.AppendChild(new XmlTreeModel((int)reader["ClassID"], (string)reader["Title"], "Class"));

  25. }

  26. }

  27.         reader.Close();

  28.         cmd.Dispose();

  29.         cn.Close();

  30.         cn.Dispose();

  31. }

  32. #endregion

  33. }

備註一點:我所展現的樹狀路徑是記錄在資料庫中,而不是用計算的,因為每次都要計算,太累而且會影響Server loading
我的Table Schema如下:

SQL:

  1. CREATE TABLE [dbo].[TB_QAClasses] (

  2. [ClassID] [int] IDENTITY (1, 1) NOT NULL ,

  3. [Title] [nvarchar] (32) NOT NULL ,

  4. [DataPath] [varchar] (256) NOT NULL

  5. ) ON [PRIMARY]

  6. GO

  7. ALTER TABLE [dbo].[TB_QAClasses] ADD

  8.     CONSTRAINT [DF_TB_QAClasses_ParentID] DEFAULT ('0') FOR [DataPath],

  9.     CONSTRAINT [PK_TB_QAClasses] PRIMARY KEY  CLUSTERED

  10. (

  11. [ClassID]

  12. )  ON [PRIMARY]

  13. GO

[2005/08/01 15:53補充]
資料表內容如下...

ClassID Title DataPath
1 類別一 0/1
2 類別二 0/2
3 類別一之一 0/1/3
4 類別二之一 0/2/4

準備工作已經做完了... 現在要來在網頁裡利用TreeView來展現樹狀資料了

1. 先在網頁裡新增兩個元件XmlDataSource(更名為xds)以及TreeView(更名為tv)
2. 將以下程式段加入你的程式碼網頁中

C#:

  1. protected void Page_Load(object sender, EventArgs e) {

  2. if (!IsPostBack) {

  3.         SetTreeView();

  4. }

  5. }

  6. private void SetTreeView() {

  7.     xds.Data = new QAManager().XmlString;       // 利用QAManager自資料庫中取回資料並轉成XML格式

  8.     xds.GetXmlDocument().LoadXml(xds.Data);     // 利用XmlDataSource的GetXmlDocument()載入XML資料

  9.     tv.DataBindings.Clear();

  10.     TreeNodeBinding tnb = new TreeNodeBinding();// 設定TreeView的節點

  11.     tnb.TextField = "Title";                    //

  12.     tnb.ValueField = "IndexID";                 //

  13.     tnb.ToolTipField = "Title";                 //

  14.     tv.DataBindings.Add(tnb);                   //

  15.     tv.DataSourceID = "xds";                    // 指定TreeView的DataSourceID為xds

  16.     tv.DataBind();                              // 執行Databind()

  17.     tv.ExpandAll();                             // 展開樹狀目錄

  18. }

好了~ 執行看看吧... 利用以上方法,我想... 利用TreeView來展現資料庫裡的樹狀資料再也不是件難事了... ^^