轉帖|其它|編輯:郝浩|2011-06-30 14:19:51.000|閱讀 4406 次
概述:最近項目需要,使用一個樹型控件,其實數據量不大,簡單使用一次遞歸就可以完事,但話說回來,想想,當數據量達到一個量級時,這個方法明顯就不足(程序運行十分不給力),而使用節點的深度特性實現加載控制,達到動態生成節點項的目的,這不失為一個好方法。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
最近項目需要,使用一個樹型控件,其實數據量不大,簡單使用一次遞歸就可以完事,但話說回來,想想,當數據量達到一個量級時,這個方法明顯就不足(程序運行十分不給力),而使用節點的深度特性實現加載控制,達到動態生成節點項的目的,這不失為一個好方法。
先來看看本實例的完成圖(此處只實現其中動態加載功能,其實后續再補上):
技術點:
數據庫結構:
其中Depth為節點深度
核心類TreeViewHelper代碼(代碼寫得沒水平請不要見笑,呵呵):
public static void CreatTreeView(TreeView _myTreeView,
myEx_TreeViewItem _parentNode, DataTable dt,
bool isRoot = true, bool isActivity = true, int Depth = 3)
{
string myFilterString = isRoot? "ParentID = 0":"
ParentID = " + _parentNode.ID.ToString();
if (isActivity)
{
#region 動態加載節點
if (Depth > 0)
{
foreach (DataRow row in dt.Select(myFilterString))
{
myEx_TreeViewItem item = new myEx_TreeViewItem();
item.ID = (int)row["ID"];
item.Depth = (int)row["Depth"];
item.ItemContent = row["NodeName"].ToString();
item.ParentID = (int)row["ParentID"];
item.ItemPath = row["NodePath"].ToString();
item.IconPath = row["IconPath"].ToString();
item.IsExpanded = false;
if (isRoot)
{
_myTreeView.Items.Clear(); //加載根節點前先清除Treeview控件項
item.IsExpanded = true;
_myTreeView.Items.Add(item); //新增根節點
}
else
{
item.IsExpanded = false;
_parentNode.Items.Add(item); //新增下級節點
}
CreatTreeView(_myTreeView, item, dt,false,true,Depth-1); }
}
#endregion
}
else
{
#region 遞歸生成樹
foreach (DataRow row in dt.Select(myFilterString))
{
myEx_TreeViewItem item = new myEx_TreeViewItem();
item.ID = (int)row["ID"];
item.Depth = (int)row["Depth"];
item.ItemContent = row["NodeName"].ToString();
item.ParentID = (int)row["ParentID"];
item.ItemPath = row["NodePath"].ToString();
item.IconPath = row["IconPath"].ToString();
if (isRoot)
{
_myTreeView.Items.Clear();
item.IsExpanded = true;
_myTreeView.Items.Add(item); //新增根節點
}
else
{
item.IsExpanded = false;
_parentNode.Items.Add(item); //新增下級節點
}
CreatTreeView(_myTreeView, item, dt, false);
}
#endregion
}
}
public static void CreatTreeViewItemChild
(TreeView _myTreeView, myEx_TreeViewItem _SelectedParentItem,
DataTable dt, int Depth = 2)
{
_SelectedParentItem.Items.Clear();
if (Depth > 0) //判斷加載的深度,默認只加載兩級
{
//設定過濾條件
string myFilterString;
myFilterString = "ParentID = " + _SelectedParentItem.ID.ToString();
foreach (DataRow row in dt.Select(myFilterString))
{
myEx_TreeViewItem item = new myEx_TreeViewItem();
item.ID = (int)row["ID"];
item.Depth = (int)row["Depth"];
item.ItemContent = row["NodeName"].ToString();
item.ParentID = (int)row["ParentID"];
item.ItemPath = row["NodePath"].ToString();
item.IconPath = row["IconPath"].ToString();
item.IsExpanded = false;
_SelectedParentItem.Items.Add(item); //新增下級節點
CreatTreeViewItemChild(_myTreeView, item, dt, (Depth - 1));
}
}
}
有不足之處請指點,代碼整理后再分享給大下,以下是程序的Demo,可看看實際效果,需要net4.0版本運行環境
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園