无限极分类下拉框

whoo529 2009-02-09 04:49:21
数据表结构
id parentid typename
1 1 湖北
2 2 广州
3 3 湖南
4 1 武汉
5 1 黄石
6 2 广州
7 6 天河
8 6 白云
...

id=parentid 为最大类,没有“深度”字段,
做成无限极下来框该如何绑定?
...全文
1255 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
lcomplete 2010-05-06
  • 打赏
  • 举报
回复
19楼不错
chunquanwang 2010-04-21
  • 打赏
  • 举报
回复
刚才正好用到,谢了
libo12388900bo 2009-08-13
  • 打赏
  • 举报
回复
递归+循环的 代码 怎么写呢 小弟请教!
lzs159263 2009-03-21
  • 打赏
  • 举报
回复
用递归+循环就可以了
CutBug 2009-02-18
  • 打赏
  • 举报
回复
你的数据是不是有问题,下面是我做的5级测试数据,没问题
using System;
using System.Data;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml;
using System.IO;
using System.Reflection;
using System.Net;
public partial class Default5 : System.Web.UI.Page
{
DataView dv;
/// <summary>
/// 层次分割符
/// </summary>
const string STR_TREENODE = "┆┄";
const string STR_ID = "id";
const string STR_PARENTID = "parentid";
const string STR_DISPLAYNAME = "typename";

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
dv = new DataView(this.AreaSource);
dv.Sort = STR_PARENTID;
string schar = STR_TREENODE;
if (dv.Table.Rows.Count > 0)
{
RecursBind(-1, ref schar);
}
}
}

/// <summary>
/// 递归绑定DropDownList
/// </summary>
/// <param name="pid"></param>
/// <param name="schar"></param>
private void RecursBind(int pid, ref string schar)
{
if (pid == -1)
{
foreach (DataRow row in dv.Table.Rows)
{
if (Convert.ToInt32(row[STR_ID]) == Convert.ToInt32(row[STR_PARENTID]))
{
this.AreaList.Items.Add(new ListItem(schar + row[STR_DISPLAYNAME].ToString(), row[STR_ID].ToString()));
RecursBind(Convert.ToInt32(row[STR_ID]), ref schar);
}
}
}
else
{
DataRowView[] rows = dv.FindRows(pid);
foreach (DataRowView row in rows)
{
if (Convert.ToInt32(row[STR_ID]) != Convert.ToInt32(row[STR_PARENTID]))
{
schar += STR_TREENODE;
this.AreaList.Items.Add(new ListItem(schar + row[STR_DISPLAYNAME].ToString(), row[STR_ID].ToString()));
RecursBind(Convert.ToInt32(row[STR_ID]), ref schar);
}

}
schar = STR_TREENODE;
}
}

/// <summary>
/// 测试数据源
/// </summary>
private DataTable AreaSource
{
get
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn(STR_ID, typeof(int)));
dt.Columns.Add(new DataColumn(STR_PARENTID, typeof(int)));
dt.Columns.Add(new DataColumn(STR_DISPLAYNAME, typeof(string)));

dt.Rows.Add(new object[] { 1, 1, "湖北" });
dt.Rows.Add(new object[] { 2, 2, "江苏" });
dt.Rows.Add(new object[] { 3, 3, "浙江" });
dt.Rows.Add(new object[] { 4, 1, "黄冈" });
dt.Rows.Add(new object[] { 5, 4, "黄冈镇级" });
dt.Rows.Add(new object[] { 6, 5, "黄冈村" });
dt.Rows.Add(new object[] { 7, 3, "杭州" });
dt.Rows.Add(new object[] { 8, 2, "南京" });
dt.Rows.Add(new object[] { 9, 6, "黄冈村下级" });
dt.Rows.Add(new object[] { 10, 7, "杭州区" });
dt.Rows.Add(new object[] { 11, 8, "南京区" });
dt.Rows.Add(new object[] { 12, 11, "南京区下级" });
dt.Rows.Add(new object[] { 13, 12, "南京区下级的下级" });
return dt;
}
}
}
CutBug 2009-02-18
  • 打赏
  • 举报
回复
我看一下
CutBug 2009-02-18
  • 打赏
  • 举报
回复
/// <summary>
/// 递归绑定DropDownList
/// </summary>
/// <param name="pid"></param>
/// <param name="schar"></param>
private void RecursBind(int pid, ref string schar)
{

if (pid == -1)
{
foreach (DataRow row in dv.Table.Rows)
{
if (Convert.ToInt32(row[STR_ID]) == Convert.ToInt32(row[STR_PARENTID]))
{
this.AreaList.Items.Add(new ListItem(schar + row[STR_DISPLAYNAME].ToString(), row[STR_ID].ToString()));
Response.Write(schar + row[STR_DISPLAYNAME].ToString()+"<br>");
RecursBind(Convert.ToInt32(row[STR_ID]), ref schar);
}
}
}
else
{

DataRowView[] rows = dv.FindRows(pid);
string temp=null;
for(int i=0;i<rows.Length;i++)
{
if (Convert.ToInt32(rows[i][STR_ID]) != Convert.ToInt32(rows[i][STR_PARENTID]))
{
if (temp == null) temp = schar;
schar += STR_TREENODE;
Response.Write(schar + rows[i][STR_DISPLAYNAME].ToString() + "<br>");
this.AreaList.Items.Add(new ListItem(schar + rows[i][STR_DISPLAYNAME].ToString(), rows[i][STR_ID].ToString()));
RecursBind(Convert.ToInt32(rows[i][STR_ID]), ref schar);
schar = temp;
}

}
}
}


┆┄湖北
┆┄┆┄黄冈
┆┄┆┄┆┄黄冈镇级
┆┄┆┄┆┄┆┄黄冈村
┆┄┆┄┆┄┆┄┆┄黄冈村下级
┆┄┆┄┆┄┆┄黄冈村二
┆┄┆┄┆┄黄冈镇级二
┆┄┆┄武汉
┆┄江苏
┆┄┆┄南京
┆┄┆┄┆┄南京区
┆┄┆┄┆┄┆┄南京区下级
┆┄┆┄┆┄┆┄┆┄南京区下级的下级
┆┄浙江
┆┄┆┄杭州
┆┄┆┄┆┄杭州区
┆┄┆┄宁波
whoo529 2009-02-18
  • 打赏
  • 举报
回复
漏洞在超过第二个分类的数据超过两条以上只会显示出一条正常数据,其他的都在二级分类里面


private DataTable AreaSource
{
get
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn(STR_ID, typeof(int)));
dt.Columns.Add(new DataColumn(STR_PARENTID, typeof(int)));
dt.Columns.Add(new DataColumn(STR_DISPLAYNAME, typeof(string)));

dt.Rows.Add(new object[] { 1, 1, "湖北" });
dt.Rows.Add(new object[] { 2, 2, "江苏" });
dt.Rows.Add(new object[] { 3, 3, "浙江" });
dt.Rows.Add(new object[] { 4, 1, "黄冈" });
dt.Rows.Add(new object[] { 5, 4, "黄冈镇级" });
dt.Rows.Add(new object[] { 6, 5, "黄冈村" });
dt.Rows.Add(new object[] { 7, 3, "杭州" });
dt.Rows.Add(new object[] { 8, 2, "南京" });
dt.Rows.Add(new object[] { 9, 6, "黄冈村下级" });
dt.Rows.Add(new object[] { 10, 7, "杭州区" });
dt.Rows.Add(new object[] { 11, 8, "南京区" });
dt.Rows.Add(new object[] { 12, 11, "南京区下级1" });
dt.Rows.Add(new object[] { 13, 11, "南京区下级2" });
dt.Rows.Add(new object[] { 14, 12, "南京区下级1的下级" });
return dt;
}
}

”南京区下级2“ 就会有问题
whoo529 2009-02-18
  • 打赏
  • 举报
回复
/// <summary>
/// 测试数据源
/// </summary>
private DataTable AreaSource
{
get
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn(STR_ID, typeof(int)));
dt.Columns.Add(new DataColumn(STR_PARENTID, typeof(int)));
dt.Columns.Add(new DataColumn(STR_DISPLAYNAME, typeof(string)));

dt.Rows.Add(new object[] { 1, 1, "湖北" });
dt.Rows.Add(new object[] { 2, 1, "武汉" });
dt.Rows.Add(new object[] { 3, 2, "汉口" });
dt.Rows.Add(new object[] { 4, 2, "汉阳" });
dt.Rows.Add(new object[] { 5, 4, "蔡甸" });
dt.Rows.Add(new object[] { 6, 4, "汉南" });
dt.Rows.Add(new object[] { 7, 1, "黄冈" });
dt.Rows.Add(new object[] { 8, 7, "黄冈镇级" });
dt.Rows.Add(new object[] { 9, 7, "黄冈村" });
dt.Rows.Add(new object[] { 10, 10, "南京" });

return dt;
}
}

我的数据是有两个三级分类就会只显示出一条来,其他的三级都在二级下
zhaoqiliang527 2009-02-16
  • 打赏
  • 举报
回复
关注!!!
stonehy520 2009-02-16
  • 打赏
  • 举报
回复
学习
CutBug 2009-02-16
  • 打赏
  • 举报
回复
依照你的要求改了一下
 public partial class Default : System.Web.UI.Page
{
DataView dv;
/// <summary>
/// 层次分割符
/// </summary>
const string STR_TREENODE = "┆┄";
const string STR_ID = "id";
const string STR_PARENTID = "parentid";
const string STR_DISPLAYNAME = "typename";

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
dv = new DataView(this.AreaSource);
dv.Sort = STR_PARENTID;
string schar = STR_TREENODE;
if (dv.Table.Rows.Count > 0)
{
RecursBind(-1,ref schar);
}
}
}

/// <summary>
/// 递归绑定DropDownList
/// </summary>
/// <param name="pid"></param>
/// <param name="schar"></param>
private void RecursBind(int pid,ref string schar)
{
if (pid == -1)
{
foreach (DataRow row in dv.Table.Rows)
{
if (Convert.ToInt32(row[STR_ID]) == Convert.ToInt32(row[STR_PARENTID]))
{
this.AreaList.Items.Add(new ListItem(schar + row[STR_DISPLAYNAME].ToString(), row[STR_ID].ToString()));
RecursBind(Convert.ToInt32(row[STR_ID]), ref schar);
}
}
}
else
{
DataRowView[] rows = dv.FindRows(pid);
foreach (DataRowView row in rows)
{
if (Convert.ToInt32(row[STR_ID]) != Convert.ToInt32(row[STR_PARENTID]))
{
schar += STR_TREENODE;
this.AreaList.Items.Add(new ListItem(schar + row[STR_DISPLAYNAME].ToString(), row[STR_ID].ToString()));
RecursBind(Convert.ToInt32(row[STR_ID]), ref schar);
}

}
schar = STR_TREENODE;
}
}

/// <summary>
/// 测试数据源
/// </summary>
private DataTable AreaSource
{
get
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn(STR_ID, typeof(int)));
dt.Columns.Add(new DataColumn(STR_PARENTID, typeof(int)));
dt.Columns.Add(new DataColumn(STR_DISPLAYNAME, typeof(string)));

dt.Rows.Add(new object[] { 1, 1, "湖北" });
dt.Rows.Add(new object[] { 2, 2, "江苏" });
dt.Rows.Add(new object[] { 3, 3, "浙江" });
dt.Rows.Add(new object[] { 4, 1, "黄冈" });
dt.Rows.Add(new object[] { 5, 4, "黄冈镇级" });
dt.Rows.Add(new object[] { 6, 5, "黄冈村" });
dt.Rows.Add(new object[] { 7, 3, "杭州" });
dt.Rows.Add(new object[] { 8, 2, "南京" });
return dt;
}
}
}
huxuanhui 2009-02-16
  • 打赏
  • 举报
回复
偶用js写了一个
楼主要的话给我消息

QQ 289184118
悔说话的哑巴 2009-02-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 guzhonghua 的回复:]
绑定还是那也绑定,只是查询的时候你用Parenetid=id就可以了。
例如:
select * from
tablename where parentid=页面上的当前ID
[/Quote]
这个方法可以拉
codetian 2009-02-16
  • 打赏
  • 举报
回复
我也来写一下
public partial class UserWebControl_ctlTradeType : System.Web.UI.UserControl
{
string toadd = null;

protected override void OnInit(EventArgs e)
{
base.OnInit(e);
GetTradeType("0");
}

protected void Page_Load(object sender, EventArgs e)
{

}

public string SelectedValue
{
get { return ddlTradeType.SelectedValue; }
set { ddlTradeType.SelectedValue = value; }
}


private void GetTradeType(string pid)
{
DAL.DBAccess db = DAL.DBConnection.CreateDB();
DataTable dt = db.ExecuteQuery("select * from P_TradeType where parentId=" + pid);
foreach (DataRow row in dt.Rows)
{
string name = row["TName"].ToString();
string id = row["ID"].ToString();
this.ddlTradeType.Items.Add(new ListItem(toadd + " " + row["TName"].ToString(), row["ID"].ToString()));
toadd += "┴─";
this.GetTradeType(row["id"].ToString());
toadd = toadd.Substring(0, toadd.Length - 2); //处理层次关系显示
}
}
}
spark_wu 2009-02-16
  • 打赏
  • 举报
回复
根类的parentid 还是=0好,不然你怎么判断是不是根节点呢
好像有点麻烦啊
whoo529 2009-02-16
  • 打赏
  • 举报
回复
调试了一下19楼的,确实没问题,但我的最大类不是parentid==0;
最大类是parentid==id

有点小问题
whoo529 2009-02-16
  • 打赏
  • 举报
回复

/// <summary>
/// 递归绑定DropDownList
/// </summary>
/// <param name="pid"></param>
/// <param name="schar"></param>
private void RecursBind(int pid, ref string schar, DropDownList dp)
{
if (pid == -1)
{
foreach (DataRow row in dv.Table.Rows)
{
if (Convert.ToInt32(row[STR_ID]) == Convert.ToInt32(row[STR_PARENTID]))
{
dp.Items.Add(new ListItem(schar + row[STR_DISPLAYNAME].ToString(), row[STR_ID].ToString()));
RecursBind(Convert.ToInt32(row[STR_ID]), ref schar,dp);
}
}
}
else
{
DataRowView[] rows = dv.FindRows(pid);
foreach (DataRowView row in rows)
{
if (Convert.ToInt32(row[STR_ID]) != Convert.ToInt32(row[STR_PARENTID]))
{
schar += STR_TREENODE;
dp.Items.Add(new ListItem(schar + row[STR_DISPLAYNAME].ToString(), row[STR_ID].ToString()));
RecursBind(Convert.ToInt32(row[STR_ID]), ref schar, dp);
}

}
schar = STR_TREENODE;
}
}
whoo529 2009-02-16
  • 打赏
  • 举报
回复
正解,谢谢

大家好好理解下递归,这个案例是最常用的了

jiaxfandy 2009-02-13
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 CutBug 的回复:]
写了一个DataTable数据源的
dropdownlist ID:AreaSource

C# codepublic partial class _Default : System.Web.UI.Page
{
DataView dv;
/// <summary>
/// 层次分割符
/// </summary>
const string STR_TREENODE = "┆┄";
/// <summary>
/// 顶级父节点parentid
/// </summary>
const int INT_TOPID = 0;

const string STR_ID = "id";
const string STR_PARENT…
[/Quote]


不好意思引用错误 呵呵
加载更多回复(24)

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧