数据表结构
id parentid typename
1 1 湖北
2 2 广州
3 3 湖南
4 1 武汉
5 1 黄石
6 2 广州
7 6 天河
8 6 白云
...id=parentid 为最大类,没有“深度”字段,
做成无限极下来框该如何绑定?
id parentid typename
1 1 湖北
2 2 广州
3 3 湖南
4 1 武汉
5 1 黄石
6 2 广州
7 6 天河
8 6 白云
...id=parentid 为最大类,没有“深度”字段,
做成无限极下来框该如何绑定?
例如:
select * from
tablename where parentid=页面上的当前ID
使用两个实现二级联动
一般三到四级够了吧。否则你的业务逻辑设计有缺陷。呵呵
用UpdatePanel应该可以实现无刷新
/// <summary>
/// 绑定分类下拉列表
/// </summary>
private void BindDropDownList()
{
this.TParentCate.Items.Add(new ListItem("◇根目录", "0"));
BindDropListByList(UCTreeKMCate1.ThisDataSource);
}
/// <summary>
/// List<T>里过滤根基点
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
private bool FindMatch(KnowlegeCate m)
{
if (m.ParentID == 0)
{
return true;
}
return false;
} /// <summary>
/// 按层次绑定下拉框
/// </summary>
/// <param name="mList"></param>
/// <param name="mPCateID"></param>
private void BindDropListByList(List<KnowlegeCate> mList)
{
string chrFlag = "┆┄◇";
List<KnowlegeCate> list = mList.FindAll(FindMatch);
foreach (KnowlegeCate m in list)
{
this.TParentCate.Items.Add(new ListItem(chrFlag + m.CateName, m.CateID.ToString()));
RecursionBind(mList, m.CateID, ref chrFlag);
}
} private void RecursionBind(List<KnowlegeCate> mList,int mCateID,ref string chr)
{
foreach (KnowlegeCate m in mList)
{
if (m.ParentID == mCateID)
{
chr = "┆┄" + chr;
this.TParentCate.Items.Add(new ListItem(chr + m.CateName, m.CateID.ToString()));
RecursionBind(mList, m.CateID, ref chr);
}
}
chr = "┆┄◇"; }
dropdownlist ID:AreaSource
public 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_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(INT_TOPID, ref schar);
}
}
} /// <summary>
/// 递归绑定DropDownList
/// </summary>
/// <param name="pid"></param>
/// <param name="schar"></param>
private void RecursBind(int pid,ref string schar)
{
DataRowView[] rows = dv.FindRows(pid);
if (rows.Length == 0) schar = STR_TREENODE;
foreach (DataRowView row in rows)
{
if (pid != 0)
{
schar += STR_TREENODE;
}
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);
}
} /// <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, 0, "湖北" });
dt.Rows.Add(new object[] { 2, 0, "江苏" });
dt.Rows.Add(new object[] { 3, 0, "浙江" });
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;
}
}
}
输出:
┆┄湖北
┆┄┆┄黄冈
┆┄┆┄┆┄黄冈镇级
┆┄┆┄┆┄┆┄黄冈村
┆┄江苏
┆┄┆┄南京
┆┄浙江
┆┄┆┄杭州
{
System.Collections.ArrayList allItems = new ArrayList();
if (strFirstName != "")
{
ListItem newItem = new ListItem(strFirstName, "");
allItems.Add(newItem);
}
DataRow[] rows = dt.Select(strPrtID + " = ''");
foreach (DataRow row in rows)
CreateLevelDropDownAssistant(dt, ref allItems, row, "--", strPrtID, strColID, strColName);
ListItem[] items = new ListItem[allItems.Count];
allItems.CopyTo(items);
ddlst.Items.AddRange(items);
}
public void CreateLevelDropDownAssistant(DataTable dt, ref ArrayList items, DataRow parentRow, string curHeader, string strPrtID, string strColID, string strColName)
{
ListItem newItem = new ListItem(curHeader + parentRow[strColName].ToString(), parentRow[strColID].ToString());
items.Add(newItem);
parentRow.Delete(); DataRow[] rows = dt.Select(strPrtID+" = '" + newItem.Value + "'");
for (int i = 0; i < rows.Length - 1; i++)
CreateLevelDropDownAssistant(dt, ref items, rows[i], curHeader.Replace("┣", "┃").Replace("┗", "┣") + "┣",strPrtID,strColID,strColName); if (rows.Length > 0)
CreateLevelDropDownAssistant(dt, ref items, rows[rows.Length - 1], curHeader.Replace("┣", "┃").Replace("┗", "┣") + "┗",strPrtID,strColID,strColName);
}
#endregion
最大类是parentid==id有点小问题
好像有点麻烦啊
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); //处理层次关系显示
}
}
}
楼主要的话给我消息QQ 289184118
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;
}
}
}
/// <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;
}
}
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;
}
}
}
/// 测试数据源
/// </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;
}
}
我的数据是有两个三级分类就会只显示出一条来,其他的三级都在二级下
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“ 就会有问题
/// 递归绑定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;
} }
}
}┆┄湖北
┆┄┆┄黄冈
┆┄┆┄┆┄黄冈镇级
┆┄┆┄┆┄┆┄黄冈村
┆┄┆┄┆┄┆┄┆┄黄冈村下级
┆┄┆┄┆┄┆┄黄冈村二
┆┄┆┄┆┄黄冈镇级二
┆┄┆┄武汉
┆┄江苏
┆┄┆┄南京
┆┄┆┄┆┄南京区
┆┄┆┄┆┄┆┄南京区下级
┆┄┆┄┆┄┆┄┆┄南京区下级的下级
┆┄浙江
┆┄┆┄杭州
┆┄┆┄┆┄杭州区
┆┄┆┄宁波