用C#实现的简单树型图生成算法!

这是三年前在为公司的data collect system写的一个简单树型图生成算法,现在觉得挺有意思的,现在翻出来晒晒一下.

其 实树型图是显示在DataGrid或GridView里的,如下图:
BlanceSheet  1224
├Total Assets  5465433
│└Current Assets  2542
│  ├Cash, Cash Equivalents, and Marketable Securities  245
│  │├Cash and Cash Equivalents  25425

数据表如图所示:
2011052017472816.jpg

说到显示树型图就可以想js做的树型菜单,不适合放在表格里显示了,还有就是不单要左边显示,右 边要显示数值,更不能直接用什么TreeView控件。我想了很久很久,才开窍想出来,关键就在于如何通知某个结点的子孙节点是应该有“│”,还是应该放 空格!这样树型图才能显示正确。

最终效果图如下:
2011052017470751.jpg

代码实例:

 
  
private DataView AchiveTreeView(DataView dv)
{
try
{
List
< string > nextString = new List < string > ();
GetTreeNode(dv.Table.Rows[
0 ], 0 , 0 , nextString);
return dv;
}
catch (Exception e)
{
ErrorMsg.Text
= e.Message;
ErrorMsg.ToolTip
= e.StackTrace;
}
return dv;
}

private void GetTreeNode(DataRow currentRow, int currentIdx, int count,List < string > parentPrefixArr)
{
string mid = currentRow[ " MstarID " ].ToString();
int depth = int .Parse(currentRow[ " Depth " ].ToString());
DataRow[] filterRows
= currentRow.Table.Select( " ParentMID=' " + mid + " ' " );
int childCount = filterRows.Length;
int childIndex = 0 ;

List
< string > nextString = new List < string > (); // use for prefix of children
if (depth > 0 )
{
string name = currentRow[ " MstarName " ].ToString();
string prefix = "" ;
// achive prefix of children
foreach ( string lastString in parentPrefixArr)
{
prefix
+= lastString;
nextString.Add(lastString);
}

if (currentIdx < count - 1 )
{
currentRow[
" MstarName " ] = prefix + " ├$ " + name;
nextString.Add(
" " );
}
else // last of children
{
currentRow[
" MstarName " ] = prefix + " └$ " + name;
nextString.Add(
" ** " ); // will be replace when databound event occour
}
}

foreach (DataRow dr in filterRows)
{
GetTreeNode(dr, childIndex, childCount, nextString);
childIndex
++ ;
}
}

protected void MstarView_RowDataBound( object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string name = e.Row.Cells[ 0 ].Text;
if (name.IndexOf( ' $ ' ) > - 1 )
{
string [] splitarr = name.Split( ' $ ' );
string prefix = " <span style='color:#999999'> " + splitarr[ 0 ] + " </span> " ;
string content = " <b> " + splitarr[ 1 ] + " </b> " ;
name
= prefix + content;
}
name
= name.Replace( " * " , " " );
e.Row.Cells[
0 ].Text = name;
}
}

转载于:https://www.cnblogs.com/techmango/archive/2011/05/20/Tree_Node_Graph_Arithmetic.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值