关于递归实现树结构的问题

「已注销」 2009-12-08 09:18:31
我需要的树结构跟大多数树结构不通,比方说一张表
字段1 字段2 字段3
A a 1
A a 2
A b 3
A b 1
B a 1
B b 1
B c 1


3个字段,显示成如下图形
<embed width="500" height="281" menu="false" quality="high" src="http://f.yupoo.com/v.swf?id=970953039-ff8080812563cef101256bdcc5d671ef-m" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" ></embed>

因为表和列是不能确定的 ,需要动态获取,所以需要递归,知道的大牛请告诉我如何实现
...全文
206 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2009-12-09
  • 打赏
  • 举报
回复
有人吗? 问题解决了我在加分
「已注销」 2009-12-09
  • 打赏
  • 举报
回复
DropDownLIST是空的。。。
我这里需要用TreeView显示
alianghao 2009-12-09
  • 打赏
  • 举报
回复
DropDownList控件,也看你自己,数据表是自己的定义了,ID,text,prentID
「已注销」 2009-12-09
  • 打赏
  • 举报
回复
我需要在页面放入什么样的控件? 还有这个表是固定的么? 我表名是要动态输入的
「已注销」 2009-12-09
  • 打赏
  • 举报
回复
多谢。我先去试试了
alianghao 2009-12-09
  • 打赏
  • 举报
回复
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string constr = "Provider=Microsoft.Jet.OleDb.4.0; Data Source=" + Server.MapPath("App_Data/Area.mdb");
OleDbConnection conn = new OleDbConnection(constr);
string sqlstr="select * from Item";
OleDbDataAdapter da = new OleDbDataAdapter(sqlstr, conn);
DataSet ds = new DataSet();
da.Fill(ds);
DataTable dt = ds.Tables[0];
MakeTree(dt, "prentID", "0", "ID", "text", DropDownList1, -1);
}
}


//构建多级树形结构下拉列表
/// <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 = ""; //缩入字符
int j;
//通过i来控制缩入字符的长度,我这里设定的是一个全角的空格
for (j = 0; j < i; j++)
strPading += " ";//如果要增加缩入的长度,改成两个全角的空格就可以了

foreach (DataRowView drv in dvNodeSets)
{
ListItem li = new ListItem(drv[strIndexColumn].ToString()+strPading + "├" + drv[strTextColumn].ToString(), drv[strIndexColumn].ToString());
drpBind.Items.Add(li);
MakeTree(dtNodeSets, strParentColumn, drv[strIndexColumn].ToString(), strIndexColumn, strTextColumn, drpBind, i);
}

//递归结束,要回到上一层,所以缩入量减少一个单位
i--;
}

「已注销」 2009-12-09
  • 打赏
  • 举报
回复
alianghao 这位朋友
能否给出完整代码。光看一段我也不知道怎么写
alianghao 2009-12-09
  • 打赏
  • 举报
回复
循环加递归就可以了,
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 (j = 0; j < i; j++)
strPading += " ";//如果要增加缩入的长度,改成两个全角的空格就可以了

foreach (DataRowView drv in dvNodeSets)
{
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--;
}
liaoyukun111 2009-12-09
  • 打赏
  • 举报
回复
nodeId,parentNodeId等字段 表示节点中的父子关系,只要有关系就行了,当然了,没有关系也是搞不出来的
「已注销」 2009-12-09
  • 打赏
  • 举报
回复
我这问题是 表中根本没有nodeId,parentNodeId等字段,要对任意表进行遍历生成树结构
「已注销」 2009-12-09
  • 打赏
  • 举报
回复
:( ..俺这是C#
ezmagic 2009-12-09
  • 打赏
  • 举报
回复
唉呦,不懂了,原来是C++更晕菜了,不知道思路是否正确,顶下帖,关注一下 :)
ezmagic 2009-12-09
  • 打赏
  • 举报
回复
不懂java,但是不知道这样是不是可以实现,定义一个function,根据读取出来的数据,在function中定义条件,当父节点成立时,遍历子节点,依次类推,只要条件成立,就递归调用自己
「已注销」 2009-12-09
  • 打赏
  • 举报
回复

private static string connString = "server=.;uid=sa;pwd=sa2005;database=test";
private static SqlConnection conn = new SqlConnection(connString);
DataTable table = new DataTable();
string table = this.TextBox1.Text;
string sql = "select * from '"+table+"'";
SqlDataAdapter sda = new SqlDataAdapter(sql,conn);

如何把sda得到的数据放到table中? 我需要把table作为参数传入一个方法中
SDW342422 2009-12-08
  • 打赏
  • 举报
回复
不知道如何搞 帮你顶
红街咖啡 2009-12-08
  • 打赏
  • 举报
回复
threenewbee 2009-12-08
  • 打赏
  • 举报
回复
无论什么树,都是一样的。

root node leaf
「已注销」 2009-12-08
  • 打赏
  • 举报
回复

在补充下问题,比如这次给你一张表A,A里面有5个字段,过几天给你一张表B,表里面有8个字段。
所以现在的情况是,表不知道,表里面有多少列也不知道。表里面并没有什么NodeId,parentNodeId等字段,
需要对任意表生成树结构,使用递归。求代码,分不够我在加。谢谢
mohugomohu 2009-12-08
  • 打赏
  • 举报
回复
look
「已注销」 2009-12-08
  • 打赏
  • 举报
回复

俺的意思是 A有父节点B B也有他的父节点C 如此而已 间接的父节点也算
加载更多回复(6)

62,254

社区成员

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

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

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

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