在web的treeview中可以使用checkbox来设置treeview的节点是否可以选中,是大家都知道的。我们在项目进程中也用到该方法,这里把具体实现的方法给出。希望大家有更好的方案提出。
先制定节点选择的规则:
子节点选中,自动添加父节点到记录中;父节点选中,但子节点未选中的,仅仅添加父节点。
实现的代码,c#代码页面如下:
###################################
using system;
using system.collections;
using system.componentmodel;
using system.data;
using system.drawing;
using system.web;
using system.web.sessionstate;
using system.web.ui;
using system.web.ui.webcontrols;
using system.web.ui.htmlcontrols;
using microsoft.web.ui.webcontrols;
using idal;
using classi;
namespace mstreeview
{
/// <summary>
/// webform1
/// </summary>
public class webform1 : system.web.ui.page
{
protected system.web.ui.webcontrols.label label1;
protected system.web.ui.webcontrols.button button1;
protected microsoft.web.ui.webcontrols.treeview treeview1;
protected system.web.ui.webcontrols.button button2;
protected system.web.ui.webcontrols.dropdownlist dropdownlist1;
private void page_load(object sender, system.eventargs e)
{
if(!ispostback)
{
datatable dt=new datatable();
dt=this.getdatasource();
session["dt"]=dt;
boundtreeview(this.treeview1.nodes,0);
}
}
#region web 窗体设计器生成的代码
override protected void oninit(eventargs e)
{
//
// codegen: 该调用是 asp.net web 窗体设计器所必需的。
//
initializecomponent();
base.oninit(e);
}
/// <summary>
/// 设计器支持所需的方法 – 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void initializecomponent()
{
this.button1.click += new system.eventhandler(this.button1_click);
this.button2.click += new system.eventhandler(this.button2_click);
this.load += new system.eventhandler(this.page_load);
}
#endregion
private datatable getdatasource()
{
datatable dt=new datatable("dt");
dt.columns.add(new datacolumn("id",typeof(system.int32)));
dt.columns.add(new datacolumn("pid",typeof(system.int32)));
dt.columns.add(new datacolumn("num",typeof(system.int32)));
dt.columns.add(new datacolumn("name",typeof(system.string)));
// for (int i=0;i<=10;i++)
// {
datarow dr;
dr=dt.newrow();
dr["id"]=1;
dr["pid"]=0;
dr["num"]=1;
dr["name"]="1";
dt.rows.add(dr);
dr=dt.newrow();
dr["id"]=2;
dr["pid"]=1;
dr["num"]=2;
dr["name"]="2";
dt.rows.add(dr);
dr=dt.newrow();
dr["id"]=3;
dr["pid"]=1;
dr["num"]=5;
dr["name"]="id3";
dt.rows.add(dr);
dr=dt.newrow();
dr["id"]=4;
dr["pid"]=0;
dr["num"]=2;
dr["name"]="id4";
dt.rows.add(dr);
dr=dt.newrow();
dr["id"]=5;
dr["pid"]=4;
dr["num"]=1;
dr["name"]="id5";
dt.rows.add(dr);
dr=dt.newrow();
dr["id"]=6;
dr["pid"]=0;
dr["num"]=3;
dr["name"]="id6";
dt.rows.add(dr);
dr=dt.newrow();
dr["id"]=7;
dr["pid"]=0;
dr["num"]=1;
dr["name"]="id7";
dt.rows.add(dr);
dr=dt.newrow();
dr["id"]=8;
dr["pid"]=7;
dr["num"]=1;
dr["name"]="id8";
dt.rows.add(dr);
dr=dt.newrow();
dr["id"]=9;
dr["pid"]=8;
dr["num"]=1;
dr["name"]="id9";
dt.rows.add(dr);
dr=dt.newrow();
dr["id"]=10;
dr["pid"]=8;
dr["num"]=2;
dr["name"]="id10";
dt.rows.add(dr);
dr=dt.newrow();
dr["id"]=11;
dr["pid"]=7;
dr["num"]=2;
dr["name"]="id11";
dt.rows.add(dr);
// }
return dt;
}
///此处使用递归绑定treeview的数据
private void boundtreeview(treenodecollection treenodes ,int parentid)
{
datatable dt=new datatable();
dt=(datatable)session["dt"];
dataview treedv = new dataview();
int treeid;
treenode treetemp;
string treename;
treedv.table = dt;
treedv.rowfilter = "id<>" + parentid + " and pid=" + parentid + "";
treedv.sort="num";
foreach(datarowview treedvrow in treedv)
{
treetemp=new treenode();
treename = treedvrow["name"].tostring();
treeid = convert.toint32(treedvrow["id"].tostring());
treetemp.id = treeid.tostring();
treetemp.text = treename;
treetemp.checkbox=true;
treetemp.expanded=true;
treenodes.add(treetemp);
boundtreeview(treenodes[treenodes.count – 1].nodes, treeid);
}
}
///递归treeview,把所有被选中的节点id记录到hashtable中
private void recursivetree(treeview tree,ref hashtable allid )
{
treenodecollection nodes = tree.nodes;
foreach (treenode n in nodes)
{
recursivenodes(n,ref allid);
addcheckedid(n,ref allid);
}
}
///递归treeview的节点,把所有被选中的节点id记录到hashtable中
private void recursivenodes(treenode node,ref hashtable allid)
{
foreach (treenode tn in node.nodes)
{
recursivenodes(tn,ref allid);
addcheckedid(tn,ref allid);
}
}
private void button1_click(object sender, system.eventargs e)
{
hashtable aaa=new hashtable();
recursivetree(this.treeview1,ref aaa);
}
///把被选中的节点的父节点id记录到hashtable中
private void addparentid(treenode node,ref hashtable allid)
{
try
{
treenode pnode=(treenode)node.parent;
addparentid(pnode,ref allid);
addidtohashtable(convert.toint32(pnode.id),ref allid);
}
catch
{
}
}
///把所有被选中的节点id和其父节点id记录到hashtable中
private void addcheckedid(treenode node,ref hashtable allid )
{
if(node.checked)
{
string strvalue=node.id.tostring();
int i=convert.toint32(node.id);
try
{
addparentid(node,ref allid);
}
catch
{
}
addidtohashtable(i,ref allid);
}
}
///把所有被选中的节点id记录到hashtable中,如果id已经存在,则不添加
private void addidtohashtable(int nodeid,ref hashtable allid)
{
if(!allid.containskey(nodeid))
{
allid.add(nodeid,nodeid.tostring());
}
}
private void button2_click(object sender, system.eventargs e)
{
hashtable aaa=new hashtable();
if(session["aaa"]!=null) aaa=(hashtable)session["aaa"];
session["aaa"]=aaa;
}
}
}
###################################
个人感觉这种实现的方式不是最好的,但是项目进度决定了没有太多时间来考量算法和其他实现放松。希望其他网友有更好的方案,大家共享!