Asp.net实现继承于DropDownList的树状控件(转)

  如下图所示:demo1.jpg
该控件为无限级扩展的,只需要指定其子节点字段名(默认为ID),父节点字段名(默认为parentID),以及第一层父节点的值即可(默认为0)。

 

1.首先定义常量

protected   const   string  strT = " " ;
protected   const   string  strL = " " ;
protected   const   string  strI = " " ;
protected  DataTable tempTable;
protected   int  lay  =   0 ; // 节点层数
protected   int  level = 0 ; // DropDownList顺序


2.添加属性


[Category( " 数据 " ),Description( " 第一层父节点的值 " )]
        
public   int  FirstParentValue
        
{
            
get
            
{
                
object  obj = ViewState[ " FirstParentValue " ];
                
return  ((obj == null ) ? 0 :( int )obj);
            }

            
set
            
{
                ViewState[
" FirstParentValue " ] = value;
            }

        }


        [Category(
" 数据 " ),Description( " 子字段名 " )]
        
public   string  ChildField
        
{
            
get
            
{
                
object  obj = ViewState[ " ChildField " ];
                
return  ((obj == null ) ? " ID " :( string )obj);
            }

            
set
            
{
                ViewState[
" ChildField " ] = value;
            }

        }


        [Category(
" 数据 " ),Description( " 父字段名 " )]
        
public   string  ParentField
        
{
            
get
            
{
                
object  obj = ViewState[ " ParentField " ];
                
return  ((obj == null ) ? " parentID " :( string )obj);
            }

            
set
            
{
                ViewState[
" ParentField " ] = value;
            }

        }


        [Category(
" 数据 " ),Description( " 显示文本字段名 " )]
        
public   string  ShowText
        
{
            
get
            
{
                
object  obj = ViewState[ " ShowText " ];
                
return  ((obj == null ) ? " name " :( string )obj);
            }

            
set
            
{
                ViewState[
" ShowText " ] = value;
            }

        }


3.计算当前节点所在的层以及是否为子节点,是否有兄弟节点等函数,用于生成树形


///   <summary>
        
///  递归算出指定ID所在树中的层数
        
///   </summary>
        
///   <param name="treeTable"></param>
        
///   <param name="ID"> 节点ID </param>

         private   void  FindLay(DataTable treeTable, int  ID) 
        
{
            
for ( int  i = 0 ;i < treeTable.Rows.Count;i ++
            
{
                
if  (ID  ==   int .Parse(treeTable.Rows[i][ this .ChildField].ToString()))
                
{
                    
int  parentID  =   int .Parse(treeTable.Rows[i][ this .ParentField].ToString());
     
                    
//  如果父节点不是根节点,递归
                     if (parentID  !=   0
                    
{
                        lay 
++ ;
                        FindLay(treeTable,
int .Parse(treeTable.Rows[i][ this .ParentField].ToString()));
                    }

                }

            }
            
        }
        

        
///   <summary>
        
///  判断是否有子接点
        
///   </summary>
        
///   <param name="dt"></param>
        
///   <param name="ID"> 当前节点的ID </param>
        
///   <returns></returns>

         private   bool  IsExistChildNodes(DataTable dt, string  ID)
        
{
            
bool  flag = false ;
            
if (ID == null )
                
return  flag;
            
for ( int  i = 0 ;i < dt.Rows.Count;i ++ )
            
{
                
if (dt.Rows[i][ this .ParentField].ToString() == ID)
                
{
                    flag
= true ;
                    
return  flag;
                }

                
else
                
{
                    flag
= false ;
                }

            }

            
return  flag;
        }


        
///   <summary>
        
///  判断是否有兄弟节点
        
///   </summary>
        
///   <param name="dt"></param>
        
///   <param name="ID"> 当前节点的ID </param>
        
///   <returns></returns>

         private   bool  IsBorthorNodes(DataTable dt, string  ID)
        
{            
            
bool  flag = false ;
            
if (ID == null )
                
return  flag;
            
for ( int  i = 0 ;i < dt.Rows.Count;i ++ )
            
{
                
if (dt.Rows[i][ this .ChildField].ToString() == ID && i < dt.Rows.Count - 1 )
                
{
                    
if (dt.Rows[i][ this .ParentField].ToString() == dt.Rows[i + 1 ][ this .ParentField].ToString())
                    
{
                        flag
= true ;
                        
return  flag;
                    }

                    
else
                    
{
                        flag
= false ;
                        
return  flag;
                    }

                }
              
                  
            }

            
return  flag;
        }

        
        
///   <summary>
        
///  判断当前节点是否为子节点
        
///   </summary>
        
///   <param name="dt"></param>
        
///   <param name="ID"></param>
        
///   <returns></returns>

         private   bool  IsChildNode(DataTable dt, string  ID)
        
{        
            
bool  flag = false ;
            
if (ID == null )
                
return  flag;
            
for ( int  i = 0 ;i < dt.Rows.Count;i ++ )
            
{
                
if (dt.Rows[i][ this .ChildField].ToString() == ID)
                
{
                    
if (dt.Rows[i][ this .ParentField].ToString() == " 0 " )
                    
{                      
                        flag
= false ;
                        
return  flag;
                    }

                    
else
                    
{
                        flag
= true ;
                        
return  flag;
                    }

                }

            }

            
return  flag;
        }


4.递归生成树形


///   <summary>
        
///  数据添加并生成树形
        
///   </summary>
        
///   <param name="dt"></param>
        
///   <param name="ID"></param>

         private   void  BindData(DataTable dt, string  ID)
        
{
            DataRow[] dr;
            dr
= dt.Select( this .ParentField + " = " + ID, this .ChildField + "  ASC " );            
            
for ( int  x = 0 ;x < dr.Length;x ++ )
            
{     
                
string  str = "" ;  
                lay
= 0 ;
                
this .FindLay(dt, int .Parse(dr[x][ this .ChildField].ToString()));
                
if ( this .IsChildNode(dt,dr[x][this.ChildField ].ToString()) == true )
                
{                    
                    
for ( int  i = 0 ;i < lay;i ++ )
                    
{
                        str
+= strI;
                    }

                    
if ( this .IsBorthorNodes(dt,dr[x][ " id " ].ToString()) == true )
                    
{
                        
this .Items.Insert(level, new  ListItem(str + strT + dr[x][this.ShowText ].ToString(),dr[x][this.ChildField ].ToString()));
                    }

                    
else
                    
{
                     
this .Items.Insert(level, new  ListItem(str + strL + dr[x][this.ShowText ].ToString(),dr[x][this.ChildField ].ToString()));
                    }

                }

                
else
                
{
                    
this .Items.Insert(level, new  ListItem(str + dr[x][this.ShowText ].ToString(),dr[x][this.ChildField ].ToString()));
                }
                
                level
+= 1 ;
                
this .BindData(dt,dr[x][ this .ChildField].ToString()); // 递归生成树
            }

        }


5.绑定数据


  ///   <summary>
        
///  绑定数据
        
///   </summary>
        
///   <param name="dt"> 数据源DataTable </param>

         public   void  BindListData(DataTable dt)
        
{
            tempTable
= dt.Clone();
            
this .BindData(dt, this .FirstParentValue.ToString());
        }

使用的时候调用该函数进行数据绑定!

 

 在ASP.NET中实现这个真费劲,在Silverlight中实现就方便多了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ASP.NET 中,可以使用 TextBox、DropDownList 等普通控件实现登录和注册功能。以下是一个简单的示例: 首先,创建一个登录页面,包括用户名和密码的输入框以及一个“登录”按钮。可以使用如下代码: ``` <%@ Page Language="C#" %> <!DOCTYPE html> <html> <head runat="server"> <title>Login Page</title> </head> <body> <form id="form1" runat="server"> <div> <label>Username:</label> <asp:TextBox ID="txtUsername" runat="server"></asp:TextBox> </div> <div> <label>Password:</label> <asp:TextBox ID="txtPassword" runat="server" TextMode="Password"></asp:TextBox> </div> <div> <asp:Button ID="btnLogin" runat="server" Text="Login" OnClick="btnLogin_Click" /> </div> </form> </body> </html> ``` 然后,在后台代码中实现登录功能。可以在按钮的 OnClick 事件中编写代码来验证用户名和密码。以下是一个简单的示例: ``` protected void btnLogin_Click(object sender, EventArgs e) { string username = txtUsername.Text; string password = txtPassword.Text; // 在这里编写验证用户名和密码的代码 // 如果验证通过,可以跳到另一个页面 // 如果验证失败,可以显示错误消息 } ``` 接下来,创建一个注册页面,包括用户名、密码、确认密码和邮箱等输入框以及一个“注册”按钮。可以使用如下代码: ``` <%@ Page Language="C#" %> <!DOCTYPE html> <html> <head runat="server"> <title>Registration Page</title> </head> <body> <form id="form1" runat="server"> <div> <label>Username:</label> <asp:TextBox ID="txtUsername" runat="server"></asp:TextBox> </div> <div> <label>Password:</label> <asp:TextBox ID="txtPassword" runat="server" TextMode="Password"></asp:TextBox> </div> <div> <label>Confirm Password:</label> <asp:TextBox ID="txtConfirmPassword" runat="server" TextMode="Password"></asp:TextBox> </div> <div> <label>Email:</label> <asp:TextBox ID="txtEmail" runat="server"></asp:TextBox> </div> <div> <asp:Button ID="btnRegister" runat="server" Text="Register" OnClick="btnRegister_Click" /> </div> </form> </body> </html> ``` 然后,在后台代码中实现注册功能。可以在按钮的 OnClick 事件中编写代码来将用户信息保存到数据库中。以下是一个简单的示例: ``` protected void btnRegister_Click(object sender, EventArgs e) { string username = txtUsername.Text; string password = txtPassword.Text; string confirmPassword = txtConfirmPassword.Text; string email = txtEmail.Text; if (password != confirmPassword) { // 如果两次输入的密码不一致,可以显示错误消息 return; } // 在这里编写将用户信息保存到数据库的代码 // 如果保存成功,可以跳到另一个页面 // 如果保存失败,可以显示错误消息 } ``` 当然,这只是一个简单的示例,实际的登录和注册功能可能需要更复杂的验证和处理逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值