本文實例講述了asp.net使用DataGridTree實現下拉樹的方法。分享給大家供大家參考。具體實現方法如下:
下拉樹實現原理:輸出json到客戶端,客戶端實現動態加載,中間不會和服務端交互。數據量支持上經測試幾千還是很快的。本下拉樹控件是用c#+js樹實現。
2.c# 計算器 計算字符串數學表達式源碼
計算數學表達式原理 采用c#實現 很實用
//a.建立兩個棧:第一個位操作數棧,第二個操作符符棧!(將棧定義為string類型)
//b.對數字來說是無條件壓入數字棧中.
//c.而對符號來說,只有當前棧頂元素的優先值小於掃到的符號時(比如”+”小於”*”),此符號才壓入棧;否則大於等於的情況是將當前棧頂元素彈出棧,與當前數字棧的前兩個數字組成式子進行計算.計算結果當作數字壓入數字棧作為棧頂元素(要捨棄已經彈出的兩個數字),而那個掃描到的符號則將代替那個彈出的符號作為棧頂元素)。
//d.最後說一下括號,原則是掃描到左括號時無條件壓入符號棧,而掃到右括號時,則彈出離棧頂最近的一個左括號以上的全部符號與數字棧的數字做運算
3.asp.net教程 datagridtree表格樹控件
繼承asp.net的datagrid控件實現的表格樹控件
/*表格樹控件說明
* 此控件繼承datagrid 新增屬性說明:
* 1.treeparentcode:頂級根節點parentcode
* 2.treedisplaydeep:展現表格樹深度默認為1
* 3.sumcolumns:自動匯總到根節點的字段集合 針對 decimal類型
* 4.新增樹狀列模板templatetreecolumn 此模板繼承了templatecolumn 重寫了方法initializecell
* 客戶端新增特性配置說明
* 1.固定列 配置 itemstyle-css教程class='tdlockedclass'
* 2.固定表頭 配置 headerstyle-cssclass='trlockedclass'
* 3.文本框 input 或 <asp:textbox 配置事件onchange='sumparent(this);' 數字改變相應所有父節點也隨著改變 針對數字型 其他不支持
* 不過可以自定義js
* 報表說明:
* 1.datagridtree.enableviewstate=false;提高加載速度
* 2.動態定義列 實現 boundcolumn column = new boundcolumn();
column.headertext = "動態列";
column.datafield = "unitname";
datagridnew.columns.add(column);
* 也可以自定義默認模板 動態加載模板 定義模板例子templatetreecolumn,不用繼承templatecolumn,實現接口 itemplate initializecell 方法就可以了
* 不足之處:1.對於復雜多行表頭 不知 如何實現
* 2.表頭和列固定 數據量大時 會影響反映速度 一千左右的數據量 還時沒問題的 數據量在大的話 課考慮采用ajax動態加載 目前此功能還沒實現
實例代碼
復制代碼 代碼如下:private void maketree(datatable dtnodesets, string strparentcolumn, string strrootvalue, string strindexcolumn, string strtextcolumn, dropdownlist drpbind, int i)
{
//每向下一層,多一個縮入單位
i++;
dataview dvnodesets = new dataview(dtnodesets);
dvnodesets.rowfilter = strparentcolumn + "=" + strrootvalue;
string strpading = ""; //縮入字符
//通過i來控制縮入字符的長度,我這裡設定的是一個全角的空格
for (int j = 0; j < i; j++)
strpading += " ";//如果要增加縮入的長度,改成兩個全角的空格就可以了
foreach (datarowview drv in dvnodesets)
{
treenode tnnode = new treenode();
listitem li = new listitem(strpading + "├" + drv[strtextcolumn].tostring(), drv[strindexcolumn].tostring());
drpbind.items.add(li);
maketree(dtnodesets, strparentcolumn, drv[strindexcolumn].tostring(), strindexcolumn, strtextcolumn, drpbind, i);
}
//遞歸結束,要回到上一層,所以縮入量減少一個單位
i--;
}
/// <summary>
/// sql語句查詢,再綁定到droplist裡面
/// </summary>
private void createtree()
{
//查詢zonelist
string sql = "select * from master_department where parent_department='003'";
dataset ds = db.getds();
datatable dt = ds.tables[0];
maketree(dt, "parent_department", "003", "department_code", "department_name", dropdownlist1, -1);
}
網上找的另一個比較好的實例
復制代碼 代碼如下:using system;
using system.collections.generic;
using system.text;
using system.web.ui.webcontrols;
namespace interface.common
{
public interface idropdowntree : idisposable
{
/**//// <summary>
/// 返回dictionary裡分別對應id,文本,如果沒有子節點返回null
/// </summary>
/// <param name="parentid">父節點id</param>
/// <returns></returns>
dictionary<string, string> getchildcategory(string parentid);
/**//// <summary>
/// 代碼裡寫return new interface.common.dropdowntree(this);
/// </summary>
dropdowntree dropdowntree
{
get;
}
}
public sealed class dropdowntree
{
idropdowntree _dropdowntree;
public dropdowntree(idropdowntree dropdowntree)
{
_dropdowntree = dropdowntree;
}
/**//// <summary>
/// 用於樹的前綴
/// </summary>
/// <param name="islast">是否是同級節點中的最後一個</param>
/// <param name="haschild">本節點是否擁有子節點</param>
/// <param name="parentstring">父節點前綴符號</param>
/// <returns>本節點的前綴</returns>
private string getprefix(bool islast, bool haschild, string parentstring)
{
string result = string.empty;
if (!string.isnullorempty(parentstring))
{
parentstring = parentstring.remove(parentstring.length - 1).replace("├", "│").replace("└", " ");
result += parentstring;
}
if (islast)
{
result += "└";
}
else
{
result += "├";
}
if (haschild)
{
result += "┬";
}
else
{
result += "─";
}
return result;
}
綁定下拉菜單#region 綁定下拉菜單
/**//// <summary>
/// 綁定連動級的下拉菜單
/// </summary>
/// <param name="ddlgoodstype">傳進一個被綁定的dropdownlist</param>
/// <param name="removeid">被排除綁定的節點id</param>
/// <param name="autodispose">是否自動釋放</param>
public void bindtodropdownlist(dropdownlist ddlgoodstype, string removeid,string parentid, bool autodispose)
{
if (ddlgoodstype != null)
{
listitem listitem = null;
string currentid = parentid;//根節點/父id
string currentsign = string.empty;//當前節點符號;
string parrentsign = string.empty; //父節點符號;
bool haschild = true;//是否有子
queue<string> parentkeylist = new queue<string>();//存 有子節點的 節點id
queue<string> parentsignlist = new queue<string>();//對應節點id的前綴符號
int itemindexof = 0;//父節點所在的位置
while (haschild)
{
int lastonecount = 1;//用於計算在同級別中是否最後一個
dictionary<string, string> childlist = _dropdowntree.getchildcategory(currentid);// 得到子節點列表
if (childlist != null && childlist.count > 0)
{
if (!string.isnullorempty(removeid) && childlist.containskey(removeid))
{
childlist.remove(removeid);
}
foreach (keyvaluepair<string, string> entry in childlist)
{
if (_dropdowntree.getchildcategory(entry.key) != null)//存在子
{
currentsign = getprefix(lastonecount == childlist.count, true, parrentsign);
listitem = new listitem(currentsign + entry.value, entry.key);
parentkeylist.enqueue(entry.key);//當前的節點id
parentsignlist.enqueue(currentsign);//當前的節點符號
}
else//不存在子
{
currentsign = getprefix(lastonecount == childlist.count, false, parrentsign);
listitem = new listitem(currentsign + entry.value, entry.key);
}
if (ddlgoodstype.items.count != 0)
{
itemindexof = string.isnullorempty(currentid) ? itemindexof + 1 : ddlgoodstype.items.indexof(ddlgoodstype.items.findbyvalue(currentid)) + lastonecount;
}
ddlgoodstype.items.insert(itemindexof, listitem);//添加子節點
lastonecount++;
}
if (parentkeylist.count > 0)//存在子節點時
{
currentid = parentkeylist.dequeue();
parrentsign = parentsignlist.dequeue();
}
else
{
haschild = false;
}
}
else
{
break;
}
}
if (autodispose)
{
_dropdowntree.dispose();
}
}
}
/**//// <summary>
/// 綁定連動級的下拉菜單
/// </summary>
/// <param name="ddlgoodstype">傳進一個被綁定的dropdownlist</param>
public void bindtodropdownlist(dropdownlist ddlgoodstype)
{
bindtodropdownlist(ddlgoodstype, string.empty,null, true);
}
/**//// <summary>
/// 綁定連動級的下拉菜單
/// </summary>
/// <param name="ddlgoodstype">傳進一個被綁定的dropdownlist</param>
/// <param name="removeid">被排除的id</param>
public void bindtodropdownlist(dropdownlist ddlgoodstype, string removeid)
{
bindtodropdownlist(ddlgoodstype, removeid,null, true);
}
/**//// <summary>
/// 綁定連動級的下拉菜單
/// </summary>
/// <param name="ddlgoodstype">傳進一個被綁定的dropdownlist</param>
/// <param name="removeid">被排除的id,若沒有,傳null</param>
/// <param name="parentid">起始父id</param>
public void bindtodropdownlist(dropdownlist ddlgoodstype, string removeid,string parentid)
{
bindtodropdownlist(ddlgoodstype, removeid,parentid, true);
}
#endregion
}
}
調用方法很簡單:
1.繼承自idropdowntree接口
2.實現3個接口方法實現接口代碼示例[dispose方法自己實現],最主要的是自己實現獲得子級的方法
復制代碼 代碼如下:idropdowntree 成員
#region idropdowntree 成員
public dictionary<string, string> getchildcategory(string parentid)
{
string where = "parentid='" + parentid + "'";
if (string.isnullorempty(parentid))
{
where = "parentid is null or parentid='" + guid.empty + "'";
}
list<goodscategorybean> _goodscategorylist = selectlist(0, where, string.empty, false);
if (_goodscategorylist != null && _goodscategorylist.count > 0)
{
dictionary<string, string> categorylist = new dictionary<string, string>();
for (int i = 0; i < _goodscategorylist.count; i++)
{
categorylist.add(_goodscategorylist[i].id.tostring(), _goodscategorylist[i].gategoryname);
}
return categorylist;
}//51aspx.com
return null;
}
public interface.common.dropdowntree dropdowntree
{
get { return new interface.common.dropdowntree(this); }
}
#endregion
頁面調用代碼: 類名.dropdowntree.bindtodropdownlist(下拉控件id);
希望本文所述對大家的asp.net程序設計有所幫助。