如何在下拉列表框里实再树形结构
如何在下拉列表框里实再树形结构 .谢谢.写的详细一点.最好有源码.我的邮箱是tenghui157@163.com
如果写到这里不方便的话.发到我的邮箱里.非常感谢 --------------------编程问答-------------------- 我也想知道 --------------------编程问答-------------------- 看看吧
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!Page.IsPostBack)
{
SqlConnection conn=new SqlConnection(ConfigurationSettings.AppSettings["conn"]);
SqlDataAdapter da=new SqlDataAdapter("select * from TreeView",conn);
DataSet ds=new DataSet();
da.Fill(ds);
bindDDL(ddl,ds,0,"");
}
}
private void bindDDL(DropDownList DDL,DataSet ds,int ParentID,string Tab)
{
DataView dv=new DataView(ds.Tables[0]);
dv.RowFilter="ParentMenu="+ParentID.ToString();
int count=0;
foreach(DataRowView Row in dv)
{
count++;
if(Tab.IndexOf("├")>-1)
{
Tab=Tab.Replace("├","│");
}
if(Tab.IndexOf("└")>-1)
{
Tab=Tab.Replace("└","");
}
if(dv.Count==count)
{
Tab =Tab+"└";
}
else
{
Tab =Tab+"├";
}
DDL.Items.Add(new ListItem(Tab+Row["MenuName"].ToString(),Row["MenuID"].ToString()));
bindDDL(ddl,ds,int.Parse(Row["MenuID"].ToString()),Tab);
Tab= Tab.Remove(Tab.Length-1,1);
}
}
--------------------编程问答-------------------- http://www.cnmaster.net/news/show.aspx?id=48&cid=25 --------------------编程问答-------------------- 这种都是用层来实现的,做web 开发的最好还是熟悉一下html和css 以及javascript, 这些是很重要的基础知识 --------------------编程问答-------------------- 标记一下,将来说不定要用到. --------------------编程问答-------------------- 你的这个写法生成后 如下代码,
<select name="ctl00$PageBody$kingDDLGroupID1$DropDownList1" id="ctl00_PageBody_kingDDLGroupID1_DropDownList1">
<option value="1">├ 环保科</option>
<option value="2">│ ├ 采油1矿</option>
<option value="6">│ │ ├ 采油1矿1队</option>
<option value="7">│ │ ├├ 采油1矿2队</option>
<option value="9">│ │ ├├├ 采油1矿4队</option>
<option value="8">│ │ ├├├└ 采油1矿3队</option>
<option value="3">│ ├├ 采油2矿</option>
<option value="10">│ ├│ ├ 采油2矿1队</option>
<option value="11">│ ├│ ├├ 采油2矿2队</option>
<option value="12">│ ├│ ├├├ 采油2矿3队</option>
<option value="13">│ ├│ ├├├└ 采油2矿4队</option>
<option value="4">│ ├├├ 采油3矿</option>
<option value="5">│ ├├├└ 采油4矿</option>
<option value="14">├├ 合同科</option>
<option value="15">├├└ 财务科</option>
</select>
每一层,只有第一个是对的,不知道如何修改!!呵呵请教!! --------------------编程问答-------------------- 代码如下:
private void bindDDL(DropDownList DDL,int ParentID,string Tab)
{
int TotalRecord = 0;
int intCount = 0;
QueryParam qp = new QueryParam();
qp.Where = "Where G_Delete=0 and G_ParentID =" + ParentID ;
qp.Orderfld = "G_ShowOrder";
qp.OrderType = 0;
ArrayList lst = BusinessFacade.sys_GroupList(qp, out TotalRecord);
foreach (sys_GroupTable Row in lst)
{
intCount++;
if (Tab.IndexOf("├ ") > -1)
{
Tab = Tab.Replace("├ ", "│ ");
}
if (Tab.IndexOf("└ ") > -1)
{
Tab = Tab.Replace("└ ", " ");
}
if (lst.Count == intCount)
{
Tab = Tab + "└ ";
}
else
{
Tab = Tab + "├ ";
}
DDL.Items.Add(new ListItem(Tab + Row.G_CName, Row.GroupID.ToString()));
if (intCount >1)
{
Tab = Tab.Remove(Tab.Length - 1, 1);
bindDDL(DDL, Row.GroupID, Tab);
}
else
{
bindDDL(DDL, Row.GroupID, Tab);
Tab = Tab.Remove(Tab.Length - 1, 1);
}
}
}
--------------------编程问答-------------------- 留着,说不定以后会用到
--------------------编程问答-------------------- 找到原因了,是因为tab连接的字符串后边有空格,哎耽误我一晚上功夫!!
新的代码如下!!
private void bindDDL(DropDownList DDL,int ParentID,string Tab)
{
int TotalRecord = 0;
int intCount = 0;
QueryParam qp = new QueryParam();
qp.Where = "Where G_Delete=0 and G_ParentID =" + ParentID ;
qp.Orderfld = "G_ShowOrder";
qp.OrderType = 0;
ArrayList lst = BusinessFacade.sys_GroupList(qp, out TotalRecord);
foreach (sys_GroupTable Row in lst)
{
intCount++;
if (Tab.IndexOf("├") > -1)
{
Tab = Tab.Replace("├", "│");
}
if (Tab.IndexOf("└") > -1)
{
Tab = Tab.Replace("└", "");
}
if (lst.Count == intCount)
{
Tab = Tab + "└";
}
else
{
Tab = Tab + "├";
}
DDL.Items.Add(new ListItem(Tab + Row.G_CName, Row.GroupID.ToString()));
bindDDL(DDL, Row.GroupID, Tab);
Tab = Tab.Remove(Tab.Length - 1, 1);
}
}
产生效果如下:
<select name="ctl00$PageBody$kingDDLGroupID1$DropDownList1" id="ctl00_PageBody_kingDDLGroupID1_DropDownList1">
<option value="1">├环保科</option>
<option value="2">│├采油1矿</option>
<option value="6">││├采油1矿1队</option>
<option value="7">││├采油1矿2队</option>
<option value="9">││├采油1矿4队</option>
<option value="8">││└采油1矿3队</option>
<option value="3">│├采油2矿</option>
<option value="10">││├采油2矿1队</option>
<option value="11">││├采油2矿2队</option>
<option value="12">││├采油2矿3队</option>
<option value="13">││└采油2矿4队</option>
<option value="4">│├采油3矿</option>
<option value="5">│└采油4矿</option>
<option value="14">├合同科</option>
<option value="15">└财务科</option>
</select>
基本实现了我的要求,
--------------------编程问答--------------------
private void AddDataTree(int parentId, string increase, DataTable source)
{
increase = increase + "---";
DataRow[] rowCollection = source.Select("父节点 = " + parentId);
foreach (DataRow row in rowCollection)
{
string itemName = increase + "|" + row["绑定Value"].ToString();
this.下拉控件.Items.Add(new ListItem(itemName, row["绑定Key"].ToString()));
//递归加载
if (source.Select("父节点 = " + Convert.ToInt32(row["当前节点"])).Length > 0)
{
AddDataTree(Convert.ToInt32(row["当前节点"]), increase, source);
}
}
}
public void Init_Control()
{
this.下拉控件.Items.Add(new ListItem("根节点", "0"));
string strIncrease = "---";
using (DataTable _table = 查出下拉控件所要绑定的所有数据)
{
foreach (DataRow row in _table.Rows)
{
this.下拉控件.Items.Add(new ListItem(strIncrease + "|" + row["绑定Value"].ToString(), row["绑定Key"].ToString()));
AddDataTree(Convert.ToInt32(row["channel_id"]), strIncrease, _tableChannel);
}
}
}
自己看咯 --------------------编程问答-------------------- 逻辑问题, 这和实现树没有什么区别。 。只是把节点改成字符串,放到DropDownList下面的item而已。 --------------------编程问答-------------------- 主调方法Init_Control()
数据形式给出来了
每个下拉项前面的符号只是个样子.
怎么配就看你个人喜好了. --------------------编程问答--------------------
--------------------编程问答-------------------- 递归循环, 一个一个加上去 --------------------编程问答-------------------- http://www.51ascx.com/50.html
/// <summary>
/// 绑定生成一个有树结构的下拉菜单
/// </summary>
/// <param name="dtNodeSets">菜单记录数据所在的表</param>
/// <param name="strParentColumn">表中用于标记父记录的字段</param>
/// <param name="strRootValue">第一层记录的父记录值(通常设计为0或者-1或者Null)用来表示没有父记录</param>
/// <param name="strIndexColumn">索引字段,也就是放在DropDownList的Value里面的字段</param>
/// <param name="strTextColumn">显示文本字段,也就是放在DropDownList的Text里面的字段</param>
/// <param name="drpBind">需要绑定的DropDownList</param>
/// <param name="i">用来控制缩入量的值,请输入-1</param>
private void MakeTree(DataTable dtNodeSets, string strParentColumn, string strRootValue, string strIndexColumn, string strTextColumn, DropDownList drpBind, int i)
{
//每向下一层,多一个缩入单位
i++;
DataView dvNodeSets = new DataView(dtNodeSets);
dvNodeSets.RowFilter = strParentColumn + "=" + strRootValue;
string strPading = ""; //缩入字符
//通过i来控制缩入字符的长度,我这里设定的是一个全角的空格
for (int j = 0; j < i; j++)
strPading += " ";//如果要增加缩入的长度,改成两个全角的空格就可以了
foreach (DataRowView drv in dvNodeSets)
{
TreeNode tnNode = new TreeNode();
ListItem li = new ListItem(strPading + "├" + drv[strTextColumn].ToString(), drv[strIndexColumn].ToString());
drpBind.Items.Add(li);
MakeTree(dtNodeSets, strParentColumn, drv[strIndexColumn].ToString(), strIndexColumn, strTextColumn, drpBind, i);
}
//递归结束,要回到上一层,所以缩入量减少一个单位
i--;
}
扩展DropDownList支持分组功能
补充:.NET技术 , ASP.NET