无限极列表
写了一个DataTable数据源的
dropdownlist ID:AreaSource
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;
}
}
}
{
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;
}
}
}
输出:
┆┄湖北
┆┄┆┄黄冈
┆┄┆┄┆┄黄冈镇级
┆┄┆┄┆┄┆┄黄冈村
┆┄江苏
┆┄┆┄南京
┆┄浙江
┆┄┆┄杭州
┆┄湖北
┆┄┆┄黄冈
┆┄┆┄┆┄黄冈镇级
┆┄┆┄┆┄┆┄黄冈村
┆┄江苏
┆┄┆┄南京
┆┄浙江
┆┄┆┄杭州