无限级分类的实现!
一级分类
┣二级分类1
┣二级分类2
┃┣三级分类2
┣二级分类3
┃┣三级分类3
┃┃┣四级分类3这样的分类!!!我发了10几个论坛就是没人愿意帮我解决问题,,估计CSDN热心朋友也不多.....
问起来都是从网络上随便COPY别人的代码,测试都没测试过!!
至少我做了几次都没成功!!
所以说特别声明,回答问题好!解决问题也要完美,不要到百度搜索下,COPY送人就....
那样完全忽悠人!.回答问题对不上号~~~~~~~---------------特别注释:需要提供_无限级原码下载!--------------
一级分类
┣二级分类1
┣二级分类2
┃┣三级分类2
┣二级分类3
┃┣三级分类3
┃┃┣四级分类3这样的分类!!!我发了10几个论坛就是没人愿意帮我解决问题,,估计CSDN热心朋友也不多.....
问起来都是从网络上随便COPY别人的代码,测试都没测试过!!
至少我做了几次都没成功!!
所以说特别声明,回答问题好!解决问题也要完美,不要到百度搜索下,COPY送人就....
那样完全忽悠人!.回答问题对不上号~~~~~~~---------------特别注释:需要提供_无限级原码下载!--------------
这个贴子可能会有所帮助
{
// 在此处放置用户代码以初始化页面
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 }
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);
}
//处理
bitpolar(日落雁行斜) 这个说的很对,就是因为不懂所以说要原码下过来认真理解,我用了TreeView实现,就是网上的原代码就是没办法....实现
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("┗",".")+"┗");
}
浪费感情了~~~~ ^o^
搞清楚原理,怎么样才能实现?代码只是实现的手段.
这是树结构的基本功能有很多深思的东西在里面.
1.结构的深度和平面形式是否考虑过?
2.对于这样的树结构在数据库中如何定制
3.以编程方式如果是传统过程编程方式主要是递归,而面向对象编程方式主要是通过对象和对象方法间接完成递归方式.
建议你看看设计模式之-组合模式.
总之就是用递归~
非常的谢谢!!!
1W个谢谢!!!!!
SimpleTypeID(主键),TypeName,ParentID
1,一级分类,null
2,二级分类1,1
3,二级分类2,1
4,三级分类2,3
5,二级分类3,1
6,三级分类3,5
7,四级分类3,6先建个表,一会把程序中的连接字符串改改
/// 简单类型信息
/// </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则是树结构对象
如果数据库数据量很大的话,不要使用本类,时间关系就不写针对大数据量加载方式了.
自己不会还嫌人家给的不对?应该是你看不懂吧。再BS一把!!!
用2.0提供的TREEVIEW 然后用XML文件
很快的
不需要写什么程序
看不懂 就自己学习,不要老问别人