欢迎光临
我们一直在努力

WEB页面TreeView的应用-(得到所有选中的节点)-.NET教程,Asp.Net开发

建站超值云服务器,限时71元/月

        在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;
  }
 }
}

###################################

个人感觉这种实现的方式不是最好的,但是项目进度决定了没有太多时间来考量算法和其他实现放松。希望其他网友有更好的方案,大家共享!

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » WEB页面TreeView的应用-(得到所有选中的节点)-.NET教程,Asp.Net开发
分享到: 更多 (0)