无限级分类的实现!
一级分类
┣二级分类1
┣二级分类2
┃┣三级分类2
┣二级分类3
┃┣三级分类3
┃┃┣四级分类3这样的分类!!!我发了10几个论坛就是没人愿意帮我解决问题,,估计CSDN热心朋友也不多.....
问起来都是从网络上随便COPY别人的代码,测试都没测试过!!
至少我做了几次都没成功!!
所以说特别声明,回答问题好!解决问题也要完美,不要到百度搜索下,COPY送人就....
那样完全忽悠人!.回答问题对不上号~~~~~~~---------------特别注释:需要提供_无限级原码下载!--------------

解决方案 »

  1.   

    http://blog.csdn.net/zjcxc/archive/2004/09/18/108876.aspx
    这个贴子可能会有所帮助
      

  2.   

    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    InitTree(TreeView1.Nodes,"0");
    }private void InitTree(TreeNodeCollection Nds,string parentId)
    {
    TreeNode tmpNd;
    dt=ZTC.Engine.DrySelects.GetTreeList(parentId);
    foreach(DataRow row in dt.Rows)
    {
    tmpNd = new TreeNode();
    tmpNd.ID = row["NodeId"].ToString();
    tmpNd.Text = row["NodeName"].ToString();
    tmpNd.NavigateUrl = row["Url"].ToString();
    Nds.Add(tmpNd);
    //在别的表中进行下一次循环,从而得到子权限,并添加入子树中
    InitTree(tmpNd.Nodes, tmpNd.ID);
    }
    注意:关键在与你人为划分数据库的结构。让代码遍历时,形成一颗树。可以无限级。要用到树形控件哦。在树形的基础上,你还可以很方便的划分权限与类别。
            TheeID  parentID   nodeID    nodeName           Url
    188 0         1         机构职能 InsAbilityInfo.aspx
    189 0         2         政策法规 LawInfo.aspx
    190 0         3         通告公告 NoticeInfo.aspx
    191 1      11        药检机构职能
    192 1      12       药品机构职能
    193 1       13        药查职能
    196 11    111   政策法规大类2
    199 11      112       药检科1
    202 11       113       药品小二
    203 2     21     药查小1
    194 2        22        通告公告小类
    195 2         23        政策法规大类1
    197 21       211      通告公告1
    198 21       212       通告公告2
    200 21       213       药检科2
    201 3        31       药品小
    204 3         32        药查小2 }
      

  3.   

    using System;
    using System.IO;
    using System.Threading;
    using System.Windows.Forms;namespace ClearSise
    {
    public delegate void OperateFileEventHandler(object source, OperatingFileEventArgs e);
    public delegate void OperateDirectoryEventHandler(object source, OperatingDirectoryEventArgs e); public delegate void SearchStartEventHandler(object source, EventArgs e);
    public delegate void SearchFinishedEventHandler(object source, EventArgs e); #region 事件参数类
    public class OperatingFileEventArgs : EventArgs
    {
    FileInfo fi;

    public OperatingFileEventArgs(FileInfo fi)
    {
    this.fi = fi;
    } public FileInfo CurrentFile
    {
    get { return fi;       }
    set { this.fi = value; }
    }
    }
    public class OperatingDirectoryEventArgs : EventArgs
    {
    DirectoryInfo di;

    public OperatingDirectoryEventArgs(DirectoryInfo di)
    {
    this.di = di;
    } public DirectoryInfo CurrentDirectory
    {
    get { return di;       }
    set { this.di = value; }
    }
    } #endregion /// <summary>
    /// Summary description for DirIterator.
    /// </summary>
    public class DirIterator
    {
    private string              dirPath = string.Empty;

    public event OperateFileEventHandler     FileOperatingEvent;
    public event OperateDirectoryEventHandler   DirectoryOperatingEvent;
    public event SearchStartEventHandler        OnSearchStart;
    public event SearchFinishedEventHandler     OnSearchFinished; //private Thread searchThread = null; public TreeNodeCollection returnObject; public DirIterator(string dirpath)
    {
    if (!Directory.Exists(dirpath)) throw new Exception("指定的路径不存在!"); this.dirPath = dirpath;
    }
    #region 设置搜索深度
    private int  deep = -1; public int Deep
    {
    get { return this.deep; }
    set { this.deep = value;}
    }
    #endregion #region 目录遍历的线程操作
    public void Iterative()
    {
    this.AbortFlag = false; //searchThread = new Thread (new ThreadStart(Search));
    //searchThread.Start();
    this.Search();

    } public void Stop()
    {
    this.AbortFlag = true;
    } public void Search()
    {
    if (OnSearchStart != null) OnSearchStart(this, new EventArgs()); //this.Search(null);
    TreeNode tn = new TreeNode();
    this.Search(null, tn);
    returnObject.Add(tn); if (OnSearchFinished != null) OnSearchFinished(this, new EventArgs());
    }
    #endregion #region 目录遍历
    int currentDeep = -1;
    bool AbortFlag = false;
    /// <summary>
    /// 目录遍历 (不带TREENODE)
    /// </summary>
    private void Search(DirectoryInfo di)
    {
    if(this.AbortFlag) return; if (di == null)
    {
    di = new DirectoryInfo(this.dirPath);
    }

    //处理
      

  4.   

    cansum396(沉觉不醒) ,heartdevil(困兽),谢谢!
    bitpolar(日落雁行斜) 这个说的很对,就是因为不懂所以说要原码下过来认真理解,我用了TreeView实现,就是网上的原代码就是没办法....实现
      

  5.   


    protected System.Web.UI.WebControls.DropDownList DropDownList1;private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    if(!IsPostBack)
    {
    DataTable myData = this.CreateTestData();CreateLevelDropDown(this.DropDownList1,myData);
    }
    }/// <summary>
    /// 模拟一些测试数据,应用时改为从数据库读取
    /// </summary>
    /// <returns></returns>
    private DataTable CreateTestData()
    {
    DataTable dt = new DataTable();
    dt.Columns.Add("ID",typeof(string));
    dt.Columns.Add("ParentID",typeof(string));
    dt.Columns.Add("TypeName",typeof(string));
    dt.Rows.Add(new object[]{1,0,"一级分类"});//假定顶级节点只有一个,并且ParentID为0
    dt.Rows.Add(new object[]{2,1,"二级分类1"});
    dt.Rows.Add(new object[]{3,1,"二级分类2"});
    dt.Rows.Add(new object[]{4,3,"三级分类2"});
    dt.Rows.Add(new object[]{5,1,"二级分类3"});
    dt.Rows.Add(new object[]{6,5,"三级分类3"});
    dt.Rows.Add(new object[]{7,6,"四级分类3"});
    dt.Rows.Add(new object[]{8,3,"三级AAAA"});
    dt.Rows.Add(new object[]{9,3,"三级BBBB"});dt.AcceptChanges();
    return dt;
    }/// <summary>
    /// 创建分级下拉框
    /// </summary>
    private void CreateLevelDropDown(DropDownList ddlst,DataTable dt)
    {
    System.Collections.ArrayList allItems = new ArrayList();
    DataRow[] rows = dt.Select("[ParentID]='0'");
    foreach(DataRow row in rows)
    CreateLevelDropDownAssistant(dt,ref allItems,row,string.Empty);ListItem[] items = new ListItem[allItems.Count];
    allItems.CopyTo(items);
    ddlst.Items.AddRange(items);
    }
    private void CreateLevelDropDownAssistant(DataTable dt,ref ArrayList items,DataRow parentRow,string curHeader)
    {
    ListItem newItem = new ListItem(curHeader+parentRow["TypeName"].ToString(),parentRow["ID"].ToString());
    items.Add(newItem);
    parentRow.Delete();DataRow[] rows = dt.Select("[ParentID]='"+newItem.Value+"'");
    for(int i=0;i<rows.Length-1;i++)
    CreateLevelDropDownAssistant(dt,ref items,rows[i],curHeader.Replace("┣","┃").Replace("┗"," ")+"┣");if(rows.Length>0)
    CreateLevelDropDownAssistant(dt,ref items,rows[rows.Length-1],curHeader.Replace("┣","┃").Replace("┗",".")+"┗");
    }
      

  6.   

    难道楼主本来就是想要TreeView实现的?....
    浪费感情了~~~~  ^o^
      

  7.   

    Eddie005(♂) №.零零伍 (♂) 你没有浪费感情了~~~~我想要的确实是啊,,希望你,,,能加我QQ:或者,我加你啊,,,想解决问题啊!!我还没有搞顶啊 ,,,烦恼啊!!!
      

  8.   

    http://community.csdn.net/Expert/topic/5039/5039116.xml?temp=.4492151
    搞清楚原理,怎么样才能实现?代码只是实现的手段.
    这是树结构的基本功能有很多深思的东西在里面.
    1.结构的深度和平面形式是否考虑过?
    2.对于这样的树结构在数据库中如何定制
    3.以编程方式如果是传统过程编程方式主要是递归,而面向对象编程方式主要是通过对象和对象方法间接完成递归方式.
    建议你看看设计模式之-组合模式.
      

  9.   

    lxwin01(阿幸) ,,,大哥,,,我是真的急用啊。我还是看不懂啊说不清楚啊哎烦恼啊。
      

  10.   

    顶heartdevil(困兽)个,他的应该是最正确的,
    总之就是用递归~
      

  11.   

    lxwin01(阿幸)
    非常的谢谢!!!
    1W个谢谢!!!!!
      

  12.   

    数据库结构
    SimpleTypeID(主键),TypeName,ParentID
    1,一级分类,null
    2,二级分类1,1
    3,二级分类2,1
    4,三级分类2,3
    5,二级分类3,1
    6,三级分类3,5
    7,四级分类3,6先建个表,一会把程序中的连接字符串改改
      

  13.   

    /// <summary>
    /// 简单类型信息
    /// </summary>
    public class SimpleTypeInfo
    {
    private int simpleTypeId;
    private string typeName=string.Empty;
    private int parentId;
    private SimpleTypeInfo parentInfo=null;
    private SimpleTypeInfoCollection childs=null; public int SimpleTypeID
    {
    get{return simpleTypeId;}
    set{simpleTypeId=value;}
    } public string TypeName
    {
    get{return typeName;}
    set{typeName=value;}
    } public int ParentID
    {
    get{return parentId;}
    set{parentId=value;}
    } public SimpleTypeInfo ParentInfo
    {
    get{return parentInfo;}
    set{parentInfo=value;}
    } public SimpleTypeInfoCollection Childs
    {
    get{return childs;}
    set{childs=value;}
    } public SimpleTypeInfo(){} public SimpleTypeInfo(int simpleTypeId,string typeName,int parentId,SimpleTypeInfo parentInfo,SimpleTypeInfoCollection childs)
    {
    this.simpleTypeId=simpleTypeId;
    this.typeName=typeName;
    this.parentId=parentId;
    this.parentInfo=parentInfo;
    this.childs=childs;
    }
    }
    ---------------------------------------------------------------------------
    /// <summary>
    /// 简单类型信息集合
    /// </summary>
    public class SimpleTypeInfoCollection:CollectionBase
    {
    public SimpleTypeInfoCollection(){} public SimpleTypeInfo this[int index]
    {
    get{return (SimpleTypeInfo)List[index];}
    set{List[index]=value;}
    } public int Add(SimpleTypeInfo value)
    {
    return List.Add(value);
    } public int IndexOf(SimpleTypeInfo value)
    {
    return List.IndexOf(value);
    } public void Insert(int index,SimpleTypeInfo value)
    {
    List.Insert(index,value);
    } public void Remove(SimpleTypeInfo value)
    {
    List.Remove(value);
    } public bool Contains(SimpleTypeInfo value)
    {
    return List.Contains(value);
    } }
    --------------------------------------------------------------
    /// <summary>
    /// 简单类型接口
    /// </summary>
    public interface ISimpleType
    {
    SimpleTypeInfoCollection getTreeTypes();
    }
    ----------------------------------------------------------------
    /// <summary>
    /// SqlServer实现类
    /// </summary>
    public class SqlSimpleType:ISimpleType
    {
    protected string connectionString=@"database=InputDB;server=surely\mysql;user id=sa;password=123";
    public SqlSimpleType(){} #region ISimpleType 成员 /// <summary>
    /// 返回树对象
    /// </summary>
    /// <returns></returns>
    public SimpleTypeInfoCollection getTreeTypes()
    {
    DataTable dt=this.getSimpleTypes(connectionString);
    if(dt==null)
    return null;
    IDictionary all=new Hashtable();
    for(int n=0;n<dt.Rows.Count;n++)
    {
    SimpleTypeInfo info=this.ConvertType(dt.Rows[n]);
    if(info!=null)
    all.Add(info.SimpleTypeID,info);
    } SimpleTypeInfoCollection types=this.CreateTreeStructure(all);
    return types;
    } /// <summary>
    /// 根据Hash创建树结构对象
    /// </summary>
    /// <param name="all"></param>
    /// <returns></returns>
    protected SimpleTypeInfoCollection CreateTreeStructure(IDictionary all)
    {
    if(all==null||all.Count<=0)
    return null;
    IDictionaryEnumerator de=all.GetEnumerator();
    SimpleTypeInfoCollection collection=new SimpleTypeInfoCollection();
    while(de.MoveNext())
    {
    SimpleTypeInfo info=(SimpleTypeInfo)de.Value;
    //只添加根
    if(info.ParentID<=0)
    collection.Add(info);
    if(all.Contains(info.ParentID))
    {
    SimpleTypeInfo parentInfo=((SimpleTypeInfo)all[info.ParentID]);
    if(parentInfo.Childs==null)
    parentInfo.Childs=new SimpleTypeInfoCollection();
    parentInfo.Childs.Add(info);
    info.ParentInfo=parentInfo;
    }
    }
    return collection;
    } /// <summary>
    /// 返回简单类型表中的所有数据
    /// </summary>
    /// <param name="url"></param>
    /// <returns></returns>
    protected DataTable getSimpleTypes(string url)
    {
    string sql="Select * From SimpleType";
    SqlCommand cmd=new SqlCommand(sql,new SqlConnection(url));
    SqlDataAdapter da=new SqlDataAdapter(cmd);
    DataTable dt=new DataTable();
    da.Fill(dt);
    return dt;
    } /// <summary>
    /// 转换简单类型信息
    /// </summary>
    /// <param name="dr"></param>
    /// <returns></returns>
    protected SimpleTypeInfo ConvertType(DataRow dr)
    {
    if(dr==null)
    return null;
    SimpleTypeInfo info=new SimpleTypeInfo();
    info.SimpleTypeID=Convert.ToInt32(dr["SimpleTypeID"]);
    info.TypeName=Convert.ToString(dr["TypeName"]);
    info.ParentID=dr["ParentID"]==System.DBNull.Value?0:Convert.ToInt32(dr["ParentID"]);
    return info;
    } #endregion
    }
    -----------------------------------------调用方法----------------------
    ISimpleType s=new SqlSimpleType();
    SimpleTypeInfoCollection collection=s.getTreeTypes();
    collection则是树结构对象
    如果数据库数据量很大的话,不要使用本类,时间关系就不写针对大数据量加载方式了.
      

  14.   

    Eddie005(♂) №.零零伍 (♂)  晚上来不!!!!!!!!
      

  15.   

    BS这样的人
    自己不会还嫌人家给的不对?应该是你看不懂吧。再BS一把!!!
      

  16.   

    LZ 应该自己试试 
    用2.0提供的TREEVIEW 然后用XML文件
    很快的 
      不需要写什么程序  
    看不懂  就自己学习,不要老问别人