asp.net使用DataGridTree实现下拉树的方法
本文实例讲述了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.动态定义列实现boundcolumncolumn=newboundcolumn();
column.headertext="动态列";
column.datafield="unitname";
datagridnew.columns.add(column);
*也可以自定义默认模板动态加载模板定义模板例子templatetreecolumn,不用继承templatecolumn,实现接口itemplateinitializecell方法就可以了
*不足之处:1.对于复杂多行表头不知如何实现
*2.表头和列固定数据量大时会影响反映速度一千左右的数据量还时没问题的数据量在大的话课考虑采用ajax动态加载目前此功能还没实现
实例代码
privatevoidmaketree(datatabledtnodesets,stringstrparentcolumn,stringstrrootvalue,stringstrindexcolumn,stringstrtextcolumn,dropdownlistdrpbind,inti)
{
//每向下一层,多一个缩入单位
i++;
dataviewdvnodesets=newdataview(dtnodesets);
dvnodesets.rowfilter=strparentcolumn+"="+strrootvalue;
stringstrpading="";//缩入字符
//通过i来控制缩入字符的长度,我这里设定的是一个全角的空格
for(intj=0;j<i;j++)
strpading+="";//如果要增加缩入的长度,改成两个全角的空格就可以了
foreach(datarowviewdrvindvnodesets)
{
treenodetnnode=newtreenode();
listitemli=newlistitem(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>
privatevoidcreatetree()
{
//查询zonelist
stringsql="select*frommaster_departmentwhereparent_department='003'";
datasetds=db.getds();
datatabledt=ds.tables[0];
maketree(dt,"parent_department","003","department_code","department_name",dropdownlist1,-1);
}网上找的另一个比较好的实例
usingsystem;
usingsystem.collections.generic;
usingsystem.text;
usingsystem.web.ui.webcontrols;
namespaceinterface.common
{
publicinterfaceidropdowntree:idisposable
{
/**////<summary>
///返回dictionary里分别对应id,文本,如果没有子节点返回null
///</summary>
///<paramname="parentid">父节点id</param>
///<returns></returns>
dictionary<string,string>getchildcategory(stringparentid);
/**////<summary>
///代码里写returnnewinterface.common.dropdowntree(this);
///</summary>
dropdowntreedropdowntree
{
get;
}
}
publicsealedclassdropdowntree
{
idropdowntree_dropdowntree;
publicdropdowntree(idropdowntreedropdowntree)
{
_dropdowntree=dropdowntree;
}
/**////<summary>
///用于树的前缀
///</summary>
///<paramname="islast">是否是同级节点中的最后一个</param>
///<paramname="haschild">本节点是否拥有子节点</param>
///<paramname="parentstring">父节点前缀符号</param>
///<returns>本节点的前缀</returns>
privatestringgetprefix(boolislast,boolhaschild,stringparentstring)
{
stringresult=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+="─";
}
returnresult;
}
绑定下拉菜单#region绑定下拉菜单
/**////<summary>
///绑定连动级的下拉菜单
///</summary>
///<paramname="ddlgoodstype">传进一个被绑定的dropdownlist</param>
///<paramname="removeid">被排除绑定的节点id</param>
///<paramname="autodispose">是否自动释放</param>
publicvoidbindtodropdownlist(dropdownlistddlgoodstype,stringremoveid,stringparentid,boolautodispose)
{
if(ddlgoodstype!=null)
{
listitemlistitem=null;
stringcurrentid=parentid;//根节点/父id
stringcurrentsign=string.empty;//当前节点符号;
stringparrentsign=string.empty;//父节点符号;
boolhaschild=true;//是否有子
queue<string>parentkeylist=newqueue<string>();//存有子节点的节点id
queue<string>parentsignlist=newqueue<string>();//对应节点id的前缀符号
intitemindexof=0;//父节点所在的位置
while(haschild)
{
intlastonecount=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>entryinchildlist)
{
if(_dropdowntree.getchildcategory(entry.key)!=null)//存在子
{
currentsign=getprefix(lastonecount==childlist.count,true,parrentsign);
listitem=newlistitem(currentsign+entry.value,entry.key);
parentkeylist.enqueue(entry.key);//当前的节点id
parentsignlist.enqueue(currentsign);//当前的节点符号
}
else//不存在子
{
currentsign=getprefix(lastonecount==childlist.count,false,parrentsign);
listitem=newlistitem(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>
///<paramname="ddlgoodstype">传进一个被绑定的dropdownlist</param>
publicvoidbindtodropdownlist(dropdownlistddlgoodstype)
{
bindtodropdownlist(ddlgoodstype,string.empty,null,true);
}
/**////<summary>
///绑定连动级的下拉菜单
///</summary>
///<paramname="ddlgoodstype">传进一个被绑定的dropdownlist</param>
///<paramname="removeid">被排除的id</param>
publicvoidbindtodropdownlist(dropdownlistddlgoodstype,stringremoveid)
{
bindtodropdownlist(ddlgoodstype,removeid,null,true);
}
/**////<summary>
///绑定连动级的下拉菜单
///</summary>
///<paramname="ddlgoodstype">传进一个被绑定的dropdownlist</param>
///<paramname="removeid">被排除的id,若没有,传null</param>
///<paramname="parentid">起始父id</param>
publicvoidbindtodropdownlist(dropdownlistddlgoodstype,stringremoveid,stringparentid)
{
bindtodropdownlist(ddlgoodstype,removeid,parentid,true);
}
#endregion
}
}调用方法很简单:
1.继承自idropdowntree接口
2.实现3个接口方法实现接口代码示例[dispose方法自己实现],最主要的是自己实现获得子级的方法
idropdowntree成员
#regionidropdowntree成员
publicdictionary<string,string>getchildcategory(stringparentid)
{
stringwhere="parentid='"+parentid+"'";
if(string.isnullorempty(parentid))
{
where="parentidisnullorparentid='"+guid.empty+"'";
}
list<goodscategorybean>_goodscategorylist=selectlist(0,where,string.empty,false);
if(_goodscategorylist!=null&&_goodscategorylist.count>0)
{
dictionary<string,string>categorylist=newdictionary<string,string>();
for(inti=0;i<_goodscategorylist.count;i++)
{
categorylist.add(_goodscategorylist[i].id.tostring(),_goodscategorylist[i].gategoryname);
}
returncategorylist;
}//51aspx.com
returnnull;
}
publicinterface.common.dropdowntreedropdowntree
{
get{returnnewinterface.common.dropdowntree(this);}
}
#endregion页面调用代码:类名.dropdowntree.bindtodropdownlist(下拉控件id);
希望本文所述对大家的asp.net程序设计有所帮助。