绑定列表框树型控件

这个我以前在cnblogs上发过,记得那是04年刚刚工作的事。
(后来退出博客园了,博客清空了,损失很多技术收藏,原创的东东)

还经常看到有些老手不知道怎么实现,寒一个

呵呵,本人算法厉害,show一哈

 

public   class  WebTree {

    DataTable sourceData;
    StringBuilder b;
    
string  preIdField;
    
string  curIdField;
    
string  curNameField;

    
public  WebTree(DataTable t,  string  _curid,  string  _preid,  string  _curname) {
        sourceData 
=  t.Copy();
        preIdField 
=  _preid;
        curIdField 
=  _curid;
        curNameField 
=  _curname;
        b 
=   new  StringBuilder();
    }

    
public   void  BindDrp(ListItemCollection items,  string  preId, DataTable dt) {
        
if  (dt.Rows.Count  ==   0 )
            
return ;
        
// 给出两种算法。
         /* for (int i = 0; i < dt.Rows.Count; i++) {
            DataRow dr = dt.Rows[i];
            if (dr[preIdField].ToString() == preId) {

                int depth = GetDepth(dr[preIdField].ToString());
                string deep = "";
                if (depth == 0)
                    deep = "◆ ";
                else {
                    deep += "├"; //├─┣━
                    for (int j = 0; j < depth - 1; j++) {
                        deep += "─";
                    }
                    deep += " ";
                }
                items.Add(new ListItem(HttpUtility.HtmlDecode(deep + dr[curNameField].ToString()), dr[curIdField].ToString()));
                string bId = dr[curIdField].ToString();
                dt.Rows.Remove(dt.Rows[i]);
                BindDrp(items, bId, dt);
                BindDrp(items, preId, dt);
            }
        }
*/
        DataRow[] rs 
=  dt.Select(preIdField  +   " = "   +  preId,  " OrderNum asc " );
        
if  (rs.Length  ==   0 return ;
        DataRow dr 
=  rs[ 0 ];
        
int  depth  =  GetDepth(dr[preIdField].ToString());
        
string  deep  =   "" ;
        
if  (depth  ==   0 )
            deep 
=   " ◆  " ;
        
else  {
            deep 
+=   " " // ├─┣━
             for  ( int  j  =   0 ; j  <  depth  -   1 ; j ++ ) {
                deep 
+=   " " ;
            }
            deep 
+=   "   " ;
        }
        items.Add(
new  ListItem(HttpUtility.HtmlDecode(deep  +  dr[curNameField].ToString()), dr[curIdField].ToString()));
        
string  bId  =  dr[curIdField].ToString();
        dt.Rows.Remove(dr);
        BindDrp(items, bId, dt);
        BindDrp(items, preId, dt);
    }

    
public   int  GetDepth( string  id) {
        DataRow[] rows 
=  sourceData.Select(curIdField  +   " = "   +  id);
        
if  (rows.Length  ==   0 )
            
return   0 ;
        
return  GetDepth(rows[ 0 ][preIdField].ToString())  +   1 ;
    }


}

使用示例:

DataTable data  =   new  Boards().GetList( "" );
WebTree boardTree 
=   new  WebTree(data,T_Board.BoardId,T_Board.PreId,T_Board.BoardName);
boardTree.BindDrp(drpPre.Items, 
" 0 " , data);
drpPre.Items.Insert(
0 new  ListItem( "" " 0 " ));

 

DataTable data  =   new  UpFiles().GetCates( "" );
WebTree cateTree 
=   new  WebTree(data, T_FileCategory.FileCateId, T_FileCategory.PreId, T_FileCategory.CateName);
cateTree.BindDrp(drpPre.Items, 
" 0 " , data);

效果图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值