介绍完基础类及WinPop控件后下面开始介绍第一个控件DropDownTree。首先我先对该控件的功能作个介绍:

其界面如下:
论Web控件开发 - 树状控件(二)
其功能如下:

    1.支持从DataTable中载入数据
    2.支持验证器控件
    3.支持不同级别显示样式
    4.支持仅针对叶子节点的数据选择验证

其开发原刑如下:

论Web控件开发 - 树状控件(二)

其中DropDownTree中含有两个集合属性,一个Items一个ItemStyles,Items中用来保存树状结构中的节点信息,而ItemStyles则保存不同级别的节点样式,在每一个Item中也会有一个ItemStyle属性,当Item的ItemStyle不为空时,系统才会取在DropDownTree中ItemStyles集合中的样式来绘制节点。而ItemStyles集合中根据集合中的索引来决定绘制级别的样式,如绘制根节点时将会取在ItemStyles[0]中的样式,而当节点级别大于ItemStyles集合中的条目时将取最后一个为绘制样式。另外在Item中也会有一个Items集合属性以此来实现树状结构。

以下是DropDownTreeItemStyle和DropDownTreeItemStyleCollection的源代码,他们的实现和WinPopItem和WinPopItemCollection的实现基本相同。

论Web控件开发 - 树状控件(二)using System;
论Web控件开发 - 树状控件(二)
using System.Web.UI;
论Web控件开发 - 树状控件(二)
using System.Web.UI.WebControls;
论Web控件开发 - 树状控件(二)
using System.Web.UI.Design;
论Web控件开发 - 树状控件(二)
using System.Drawing.Design;
论Web控件开发 - 树状控件(二)
using System.Drawing;
论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)
using System.ComponentModel;
论Web控件开发 - 树状控件(二)
using System.ComponentModel.Design;
论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)
namespace Keyss.WebControls
{    
论Web控件开发 - 树状控件(二)    [TypeConverter(
typeof(ExpandableObjectConverter))]
论Web控件开发 - 树状控件(二)    
public class DropDownTreeItemStyle:ViewStatePartBase
{

论Web控件开发 - 树状控件(二)        
public const string ForeColorKey = "A";
论Web控件开发 - 树状控件(二)        
public const string BackColorKey = "B";
论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        Bindable(
true),
论Web控件开发 - 树状控件(二)        Category(
"Appearance"),
论Web控件开发 - 树状控件(二)        DefaultValue(
typeof(System.Drawing.Color),""),
论Web控件开发 - 树状控件(二)        NotifyParentProperty(
true),
论Web控件开发 - 树状控件(二)        TypeConverter(
typeof(WebColorConverter))
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public  System.Drawing.Color ForeColor 
{
论Web控件开发 - 树状控件(二)            
get
{
论Web控件开发 - 树状控件(二)                
object o = ViewState[ForeColorKey];
论Web控件开发 - 树状控件(二)                
return(o==null)? System.Drawing.Color.Empty:(System.Drawing.Color)o;
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)            
set
{
论Web控件开发 - 树状控件(二)                ViewState[ForeColorKey] 
= value;
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        Bindable(
true),
论Web控件开发 - 树状控件(二)        Category(
"Appearance"),
论Web控件开发 - 树状控件(二)        DefaultValue(
typeof(System.Drawing.Color),""),
论Web控件开发 - 树状控件(二)        NotifyParentProperty(
true),
论Web控件开发 - 树状控件(二)        TypeConverter(
typeof(WebColorConverter))
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public  System.Drawing.Color BackColor 
{
论Web控件开发 - 树状控件(二)            
get
{
论Web控件开发 - 树状控件(二)                
object o = ViewState[BackColorKey];
论Web控件开发 - 树状控件(二)                
return(o==null)? System.Drawing.Color.Empty:(System.Drawing.Color)o;
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)            
set
{
论Web控件开发 - 树状控件(二)                ViewState[BackColorKey] 
= value;
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        
public virtual void AddAttributesToRender(HtmlTextWriter writer)
{
论Web控件开发 - 树状控件(二)            
if(this.ForeColor!=Color.Empty)
{
论Web控件开发 - 树状控件(二)                writer.AddStyleAttribute(HtmlTextWriterStyle.Color,ColorTranslator.ToHtml(
this.ForeColor));
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)            
if(this.BackColor!=Color.Empty)
{
论Web控件开发 - 树状控件(二)                writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor,ColorTranslator.ToHtml(
this.BackColor));
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        [EditorBrowsable(EditorBrowsableState.Never)]
论Web控件开发 - 树状控件(二)        
public virtual void CopyFrom(DropDownTreeItemStyle s)
{    
论Web控件开发 - 树状控件(二)            
base.CopyFrom(s);
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        [EditorBrowsable(EditorBrowsableState.Never)]
论Web控件开发 - 树状控件(二)        
public virtual void MergeWith(DropDownTreeItemStyle s)
{
论Web控件开发 - 树状控件(二)            
base.MergeWith(s);
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion
论Web控件开发 - 树状控件(二)    }

论Web控件开发 - 树状控件(二)}

论Web控件开发 - 树状控件(二)

其中由于Style经常要作些Copy、Merge的操作因此重载了基类的MergeWith和CopyFrom方法,而为了方便样式的使用,系统定义了另外一个方法AddAttributesToRender,当在绘制Item时可以调用此方法来实现样式属性的输出。

论Web控件开发 - 树状控件(二)using System;
论Web控件开发 - 树状控件(二)
using System.Web.UI;
论Web控件开发 - 树状控件(二)
using System.Web.UI.WebControls;
论Web控件开发 - 树状控件(二)
using System.Web.UI.Design;
论Web控件开发 - 树状控件(二)
using System.Drawing.Design;
论Web控件开发 - 树状控件(二)
using System.Drawing;
论Web控件开发 - 树状控件(二)
using System.Collections;
论Web控件开发 - 树状控件(二)
using System.ComponentModel;
论Web控件开发 - 树状控件(二)
using System.ComponentModel.Design;
论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)
namespace Keyss.WebControls
{
论Web控件开发 - 树状控件(二)    [ 
论Web控件开发 - 树状控件(二)    PersistenceMode(PersistenceMode.InnerProperty),
论Web控件开发 - 树状控件(二)    ] 
论Web控件开发 - 树状控件(二)    
public class DropDownTreeItemStyleCollection:ViewStatePartCollectionBase
{
论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)        
public int Add(DropDownTreeItemStyle item)
{
论Web控件开发 - 树状控件(二)            
return base.AddItem(item);
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
public DropDownTreeItemStyle this[int index]
{
论Web控件开发 - 树状控件(二)            
get 
{
论Web控件开发 - 树状控件(二)                
if(index >= Count || index < 0)
{
论Web控件开发 - 树状控件(二)                    
return null;
论Web控件开发 - 树状控件(二)                }

论Web控件开发 - 树状控件(二)                
return (DropDownTreeItemStyle)this.InnerList[index];
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
protected override ViewStatePartBase NewItem()
{
论Web控件开发 - 树状控件(二)            
return new DropDownTreeItemStyle();
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)    }

论Web控件开发 - 树状控件(二)}

论Web控件开发 - 树状控件(二)

DropDownTreeItemStyleCollection的实现和WinPopItemCollection的实现基本一样。

以下是DropDownTreeItem的实现

论Web控件开发 - 树状控件(二)using System;
论Web控件开发 - 树状控件(二)
using System.Web.UI;
论Web控件开发 - 树状控件(二)
using System.Web.UI.WebControls;
论Web控件开发 - 树状控件(二)
using System.Web.UI.Design;
论Web控件开发 - 树状控件(二)
using System.Drawing.Design;
论Web控件开发 - 树状控件(二)
using System.Drawing;
论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)
using System.ComponentModel;
论Web控件开发 - 树状控件(二)
using System.ComponentModel.Design;
论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)
namespace Keyss.WebControls
{
论Web控件开发 - 树状控件(二)    
public class DropDownTreeItem:ViewStatePartBase
{

论Web控件开发 - 树状控件(二)        
public const string TextKey = "A";
论Web控件开发 - 树状控件(二)        
public const string ValueKey = "B";
论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        NotifyParentProperty(
true), 
论Web控件开发 - 树状控件(二)        Bindable(
true),
论Web控件开发 - 树状控件(二)        Category(
"Appearance"),
论Web控件开发 - 树状控件(二)        DefaultValue(
"")
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public string Text 

论Web控件开发 - 树状控件(二)            
get 

论Web控件开发 - 树状控件(二)                
object o = ViewState[TextKey]; 
论Web控件开发 - 树状控件(二)                
return (o == null)?string.Empty : (string)o; 
论Web控件开发 - 树状控件(二)            }
 
论Web控件开发 - 树状控件(二)            
set 

论Web控件开发 - 树状控件(二)                ViewState[TextKey] 
= value;
论Web控件开发 - 树状控件(二)            }
 
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        NotifyParentProperty(
true), 
论Web控件开发 - 树状控件(二)        Bindable(
true),
论Web控件开发 - 树状控件(二)        Category(
"Appearance"),
论Web控件开发 - 树状控件(二)        DefaultValue(
"")
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public string Value 

论Web控件开发 - 树状控件(二)            
get 

论Web控件开发 - 树状控件(二)                
object o = ViewState[ValueKey];
论Web控件开发 - 树状控件(二)                
return (o == null)?string.Empty:(string)o;
论Web控件开发 - 树状控件(二)            }
 
论Web控件开发 - 树状控件(二)            
set 

论Web控件开发 - 树状控件(二)                ViewState[ValueKey] 
= value; 
论Web控件开发 - 树状控件(二)            }
 
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        
protected DropDownTreeItemStyle _style;
论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        NotifyParentProperty(
true),
论Web控件开发 - 树状控件(二)        PersistenceMode(PersistenceMode.Attribute),
论Web控件开发 - 树状控件(二)        DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
论Web控件开发 - 树状控件(二)        TypeConverter(
typeof(ExpandableObjectConverter))
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public virtual DropDownTreeItemStyle Style 

论Web控件开发 - 树状控件(二)            
get 

论Web控件开发 - 树状控件(二)                
if(_style == null
{
论Web控件开发 - 树状控件(二)                    _style 
= new DropDownTreeItemStyle();
论Web控件开发 - 树状控件(二)                    
if(_isTrackingViewState)
论Web控件开发 - 树状控件(二)                        _style.TrackViewState();
论Web控件开发 - 树状控件(二)                }

论Web控件开发 - 树状控件(二)                
return _style; } 
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
论Web控件开发 - 树状控件(二)        Browsable(
false),
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
protected virtual DropDownTreeItemStyle RenderStyle
{
论Web控件开发 - 树状控件(二)            
get
{
论Web控件开发 - 树状控件(二)                
if(!DropDownTree.ItemStyles.IsEmpty)
{
论Web控件开发 - 树状控件(二)                    DropDownTreeItemStyle tmpStyle 
= new DropDownTreeItemStyle();
论Web控件开发 - 树状控件(二)                    
int tmpLevel = this.Level;
论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)                    
if(tmpLevel < DropDownTree.ItemStyles.Count)
{
论Web控件开发 - 树状控件(二)                        tmpStyle.CopyFrom(DropDownTree.ItemStyles[tmpLevel]);
论Web控件开发 - 树状控件(二)                    }

论Web控件开发 - 树状控件(二)                    
else
{
论Web控件开发 - 树状控件(二)                        tmpStyle.CopyFrom(
this.DropDownTree.ItemStyles[DropDownTree.ItemStyles.Count - 1]);
论Web控件开发 - 树状控件(二)                    }

论Web控件开发 - 树状控件(二)                    
if(!Style.IsEmpty)
{
论Web控件开发 - 树状控件(二)                        tmpStyle.CopyFrom(
this.Style);
论Web控件开发 - 树状控件(二)                    }

论Web控件开发 - 树状控件(二)                    
return tmpStyle;
论Web控件开发 - 树状控件(二)                }

论Web控件开发 - 树状控件(二)                
else
论Web控件开发 - 树状控件(二)                    
return this.Style;
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        
protected DropDownTree _dropDownTree;
论Web控件开发 - 树状控件(二)        
protected DropDownTreeItem _owner;
论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
论Web控件开发 - 树状控件(二)        Browsable(
false),
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public DropDownTreeItem Owner
{


论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
论Web控件开发 - 树状控件(二)        Browsable(
false),
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public DropDownTree DropDownTree
{


论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
论Web控件开发 - 树状控件(二)        Browsable(
false),
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public int Level
{
论Web控件开发 - 树状控件(二)            
get 
{
论Web控件开发 - 树状控件(二)                
int i = 0;
论Web控件开发 - 树状控件(二)                DropDownTreeItem tmpOwner 
= this._owner;
论Web控件开发 - 树状控件(二)                
while(tmpOwner != null)
{
论Web控件开发 - 树状控件(二)                    tmpOwner 
= tmpOwner.Owner;
论Web控件开发 - 树状控件(二)                    i
++;
论Web控件开发 - 树状控件(二)                }

论Web控件开发 - 树状控件(二)                
return i;
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
论Web控件开发 - 树状控件(二)        Browsable(
false),
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public int Index
{
论Web控件开发 - 树状控件(二)            
get 
{
论Web控件开发 - 树状控件(二)                
if(this.Level != 0)
论Web控件开发 - 树状控件(二)                    
return this.Owner.Items.IndexOf(this);
论Web控件开发 - 树状控件(二)                
else
论Web控件开发 - 树状控件(二)                    
return this.DropDownTree.Items.IndexOf(this);
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        
private DropDownTreeItemCollection _items;
论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        NotifyParentProperty(
true),
论Web控件开发 - 树状控件(二)        PersistenceMode(PersistenceMode.InnerProperty),
论Web控件开发 - 树状控件(二)        DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public DropDownTreeItemCollection Items
{
论Web控件开发 - 树状控件(二)            
get 
{
论Web控件开发 - 树状控件(二)                
if(_items == null
{
论Web控件开发 - 树状控件(二)                    _items 
= new DropDownTreeItemCollection();
论Web控件开发 - 树状控件(二)                    
if(this._isTrackingViewState)
论Web控件开发 - 树状控件(二)                        _items.TrackViewState();
论Web控件开发 - 树状控件(二)                }

论Web控件开发 - 树状控件(二)                
return _items;
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion        

论Web控件开发 - 树状控件(二)        
public virtual void Render(System.Web.UI.HtmlTextWriter writer)
{
论Web控件开发 - 树状控件(二)            writer.WriteLine();
论Web控件开发 - 树状控件(二)            
this.AddAttributesToRender(writer);
论Web控件开发 - 树状控件(二)            writer.RenderBeginTag(HtmlTextWriterTag.Option);
论Web控件开发 - 树状控件(二)            
this.RenderContent(writer);
论Web控件开发 - 树状控件(二)            writer.RenderEndTag();
论Web控件开发 - 树状控件(二)            writer.WriteLine();
论Web控件开发 - 树状控件(二)            
this.Items.Render(writer);
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
protected virtual void AddAttributesToRender(System.Web.UI.HtmlTextWriter writer)
{
论Web控件开发 - 树状控件(二)            
this.RenderStyle.AddAttributesToRender(writer);
论Web控件开发 - 树状控件(二)            
string tvalue = this.Value;
论Web控件开发 - 树状控件(二)            
if(this.DropDownTree.SelectLeafOnly&&(!this.Items.IsEmpty))
论Web控件开发 - 树状控件(二)                tvalue 
= string.Empty;
论Web控件开发 - 树状控件(二)            
if(tvalue!= string.Empty)
论Web控件开发 - 树状控件(二)                writer.AddAttribute(HtmlTextWriterAttribute.Value,tvalue);
论Web控件开发 - 树状控件(二)            
if(this.DropDownTree.SelectedValue == this.Value)
论Web控件开发 - 树状控件(二)                writer.AddAttribute(HtmlTextWriterAttribute.Selected,
"true");
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
protected virtual void RenderContent(System.Web.UI.HtmlTextWriter writer)
{    
论Web控件开发 - 树状控件(二)            writer.Write(
string.Format("{0} {1}"this.GetTabText() + this.GetPreText(), this.Text));    
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
protected virtual string GetTabText()
{
论Web控件开发 - 树状控件(二)            
if(this.Level == 0return string.Empty;
论Web控件开发 - 树状控件(二)            DropDownTreeItem pItem 
= this.Owner;
论Web控件开发 - 树状控件(二)            DropDownTreeItemCollection p_pItems;
论Web控件开发 - 树状控件(二)            
if(this.Level > 1)
论Web控件开发 - 树状控件(二)                p_pItems 
= pItem.Owner.Items;
论Web控件开发 - 树状控件(二)            
else
论Web控件开发 - 树状控件(二)                p_pItems 
= this.DropDownTree.Items;
论Web控件开发 - 树状控件(二)            
if(pItem.Index == p_pItems.Count-1)
论Web控件开发 - 树状控件(二)                
return string.Format("{0}{1}",pItem.GetTabText(), "&nbsp;&nbsp;&nbsp;&nbsp;" + this.DropDownTree.TabString);
论Web控件开发 - 树状控件(二)            
else
论Web控件开发 - 树状控件(二)                
return string.Format("{0}{1}",pItem.GetTabText(), "" + this.DropDownTree.TabString);
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
protected virtual string GetPreText()
{
论Web控件开发 - 树状控件(二)            
int l = this.Level;
论Web控件开发 - 树状控件(二)            
int i = this.Index;
论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)            DropDownTreeItemCollection pItems;
论Web控件开发 - 树状控件(二)            
if(l == 0)
论Web控件开发 - 树状控件(二)                pItems 
= this.DropDownTree.Items;
论Web控件开发 - 树状控件(二)            
else
论Web控件开发 - 树状控件(二)                pItems 
= this.Owner.Items;
论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)            
if((l == 0)&&(pItems.Count == 1))
论Web控件开发 - 树状控件(二)                
return "";
论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)            
if((l == 0&& (i == 0&& (pItems.Count > 1))
论Web控件开发 - 树状控件(二)                
return "";
论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)            
if(i == (pItems.Count-1))
论Web控件开发 - 树状控件(二)                
return "";
论Web控件开发 - 树状控件(二)            
else
论Web控件开发 - 树状控件(二)                
return "";
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion


论Web控件开发 - 树状控件(二)        
public override void SetDirty()
{
论Web控件开发 - 树状控件(二)            
base.SetDirty ();
论Web控件开发 - 树状控件(二)            Style.SetDirty();
论Web控件开发 - 树状控件(二)            Items.SetDirty();
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion
论Web控件开发 - 树状控件(二)        
public override void TrackViewState()
{
论Web控件开发 - 树状控件(二)            
base.TrackViewState();
论Web控件开发 - 树状控件(二)            Style.TrackViewState();
论Web控件开发 - 树状控件(二)            Items.TrackViewState();
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
public override object SaveViewState()
{
论Web控件开发 - 树状控件(二)            
object[] savedState = new object[3];
论Web控件开发 - 树状控件(二)            savedState[
0= base.SaveViewState();
论Web控件开发 - 树状控件(二)            savedState[
1= Style.SaveViewState();
论Web控件开发 - 树状控件(二)            savedState[
2= Items.SaveViewState();
论Web控件开发 - 树状控件(二)            
for(int i=0;i<savedState.Length;i++)
{
论Web控件开发 - 树状控件(二)                
if(savedState[i] != null)
论Web控件开发 - 树状控件(二)                    
return savedState;
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)            
return null;
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
public override void LoadViewState(object state)
{
论Web控件开发 - 树状控件(二)            
if(state !=null)
{
论Web控件开发 - 树状控件(二)                
object[] savedState = (object[])state;
论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)                
if(savedState[0!= null)
论Web控件开发 - 树状控件(二)                    
base.LoadViewState(savedState[0]);
论Web控件开发 - 树状控件(二)                
if(savedState[1!= null)
论Web控件开发 - 树状控件(二)                    Style.LoadViewState(savedState[
1]);
论Web控件开发 - 树状控件(二)                
if(savedState[2!= null)
论Web控件开发 - 树状控件(二)                    Items.LoadViewState(savedState[
2]);
论Web控件开发 - 树状控件(二)            }
    
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        
public virtual void Init()
{
论Web控件开发 - 树状控件(二)            
this.Items.Owner = this;
论Web控件开发 - 树状控件(二)            
this.Items.DropDownTree = this.DropDownTree;
论Web控件开发 - 树状控件(二)            
this.Items.Init();
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        
public virtual void LoadFromDataRow(System.Data.DataRow row)
{
论Web控件开发 - 树状控件(二)            System.Data.DataTable table 
= row.Table;
论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)            
if(table.Columns.Contains("Text"))
{
论Web控件开发 - 树状控件(二)                
this.Text = row["Text"].ToString();
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)            
if(table.Columns.Contains("Value"))
{
论Web控件开发 - 树状控件(二)                
this.Value = row["Value"].ToString();
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion
论Web控件开发 - 树状控件(二)    }

论Web控件开发 - 树状控件(二)}


以下是DropDownTreeItemCollection的源代码

论Web控件开发 - 树状控件(二)using System;
论Web控件开发 - 树状控件(二)
using System.Web.UI;
论Web控件开发 - 树状控件(二)
using System.Web.UI.WebControls;
论Web控件开发 - 树状控件(二)
using System.Web.UI.Design;
论Web控件开发 - 树状控件(二)
using System.Drawing.Design;
论Web控件开发 - 树状控件(二)
using System.Drawing;
论Web控件开发 - 树状控件(二)
using System.Collections;
论Web控件开发 - 树状控件(二)
using System.ComponentModel;
论Web控件开发 - 树状控件(二)
using System.ComponentModel.Design;
论Web控件开发 - 树状控件(二)
namespace Keyss.WebControls
{
论Web控件开发 - 树状控件(二)    
public class DropDownTreeItemCollection:ViewStatePartCollectionBase
{

论Web控件开发 - 树状控件(二)        
protected DropDownTree _dropDownTree;
论Web控件开发 - 树状控件(二)        
protected DropDownTreeItem _owner;
论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
论Web控件开发 - 树状控件(二)        Browsable(
false),
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public DropDownTreeItem Owner
{


论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
论Web控件开发 - 树状控件(二)        Browsable(
false),
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public DropDownTree DropDownTree
{


论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
论Web控件开发 - 树状控件(二)        Browsable(
false),
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public int Level
{
论Web控件开发 - 树状控件(二)            
get 
{
论Web控件开发 - 树状控件(二)                
int i = 0;
论Web控件开发 - 树状控件(二)                DropDownTreeItem tmpOwner 
= this._owner;
论Web控件开发 - 树状控件(二)                
while(tmpOwner != null)
{
论Web控件开发 - 树状控件(二)                    tmpOwner 
= tmpOwner.Owner;
论Web控件开发 - 树状控件(二)                    i
++;
论Web控件开发 - 树状控件(二)                }

论Web控件开发 - 树状控件(二)                
return i;
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        
public int Add(DropDownTreeItem item)
{    
论Web控件开发 - 树状控件(二)            
return this.AddItem(item);
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
protected override int AddItem(ViewStatePartBase item)
{        
论Web控件开发 - 树状控件(二)            DropDownTreeItem mItem 
= (DropDownTreeItem)item;
论Web控件开发 - 树状控件(二)            mItem.DropDownTree 
= this.DropDownTree;
论Web控件开发 - 树状控件(二)            mItem.Owner 
= this.Owner;
论Web控件开发 - 树状控件(二)            mItem.Init();
论Web控件开发 - 树状控件(二)            
return base.AddItem(mItem);
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
public DropDownTreeItem this[int index]
{
论Web控件开发 - 树状控件(二)            
get 
{
论Web控件开发 - 树状控件(二)                
if(index >= Count || index < 0)
{
论Web控件开发 - 树状控件(二)                    
return null;
论Web控件开发 - 树状控件(二)                }

论Web控件开发 - 树状控件(二)                
return (DropDownTreeItem)this.InnerList[index];
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
public int IndexOf(DropDownTreeItem item)
{
论Web控件开发 - 树状控件(二)            
return this.InnerList.IndexOf(item);
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
public DropDownTreeItem GetItemByValue(string _value)
{
论Web控件开发 - 树状控件(二)            
if(!IsEmpty)
{
论Web控件开发 - 树状控件(二)                
foreach(DropDownTreeItem item in this.InnerList)
{
论Web控件开发 - 树状控件(二)                    
if(item.Value==_value)
论Web控件开发 - 树状控件(二)                        
return item;
论Web控件开发 - 树状控件(二)                    
else
{
论Web控件开发 - 树状控件(二)                        DropDownTreeItem item1 
= item.Items.GetItemByValue(_value);
论Web控件开发 - 树状控件(二)                        
if(item1!=null)
论Web控件开发 - 树状控件(二)                            
return item1;
论Web控件开发 - 树状控件(二)                    }

论Web控件开发 - 树状控件(二)                }

论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)            
return null;
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        
public virtual void Render(System.Web.UI.HtmlTextWriter writer)
{
论Web控件开发 - 树状控件(二)            
if(!IsEmpty)
{
论Web控件开发 - 树状控件(二)                
for(int i=0;i<this.Count;i++)
{
论Web控件开发 - 树状控件(二)                    
this[i].Render(writer);
论Web控件开发 - 树状控件(二)                }

论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        
public virtual void Init()
{
论Web控件开发 - 树状控件(二)            
for(int i = 0; i < this.Count; i ++)
{
论Web控件开发 - 树状控件(二)                
this[i].DropDownTree = this.DropDownTree;
论Web控件开发 - 树状控件(二)                
this[i].Owner = this.Owner;
论Web控件开发 - 树状控件(二)                
this[i].Init();
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        
protected override ViewStatePartBase NewItem()
{
论Web控件开发 - 树状控件(二)            
return new DropDownTreeItem();
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion
论Web控件开发 - 树状控件(二)    }

论Web控件开发 - 树状控件(二)}

论Web控件开发 - 树状控件(二)

最后是DropDownTree的代码
论Web控件开发 - 树状控件(二)using System;
论Web控件开发 - 树状控件(二)
using System.Web.UI;
论Web控件开发 - 树状控件(二)
using System.Web.UI.WebControls;
论Web控件开发 - 树状控件(二)
using System.ComponentModel;
论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)
namespace Keyss.WebControls
{
论Web控件开发 - 树状控件(二)    [
论Web控件开发 - 树状控件(二)    ParseChildren(
true),
论Web控件开发 - 树状控件(二)    ValidationPropertyAttribute(
"SelectedValue"),
论Web控件开发 - 树状控件(二)    PersistChildren(
false),
论Web控件开发 - 树状控件(二)    DefaultProperty(
"Items"),
论Web控件开发 - 树状控件(二)    ToolboxData(
"<{0}:DropDownTree runat=server></{0}:DropDownTree>")]
论Web控件开发 - 树状控件(二)    
public class DropDownTree : System.Web.UI.WebControls.WebControl,IPostBackDataHandler
{

论Web控件开发 - 树状控件(二)        
public virtual void LoadFromTable(System.Data.DataTable table,bool isStr, string idField, string parentIDField)
{
论Web控件开发 - 树状控件(二)            
try
{
论Web控件开发 - 树状控件(二)                
this.Items.Clear();
论Web控件开发 - 树状控件(二)                System.Data.DataRow[] rows 
= table.Select(string.Format("{0} is null",parentIDField));
论Web控件开发 - 树状控件(二)                
foreach(System.Data.DataRow row in rows)
{
论Web控件开发 - 树状控件(二)                    Keyss.WebControls.DropDownTreeItem item 
= new Keyss.WebControls.DropDownTreeItem();
论Web控件开发 - 树状控件(二)                    item.LoadFromDataRow(row);
论Web控件开发 - 树状控件(二)                    
this.Items.Add(item);
论Web控件开发 - 树状控件(二)                    LoadItemsFromTable(item, row[idField], table, isStr, idField, parentIDField);
论Web控件开发 - 树状控件(二)                }

论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)            
catch
{
论Web控件开发 - 树状控件(二)                
throw new ArgumentException("Table or filed name error!",table.TableName);
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
protected virtual void LoadItemsFromTable(DropDownTreeItem item, object idValue, System.Data.DataTable table,bool isStr,string idField, string parentIDField)
{
论Web控件开发 - 树状控件(二)            
string selectStr;
论Web控件开发 - 树状控件(二)            
if(isStr)
{
论Web控件开发 - 树状控件(二)                selectStr 
= "{0} = '{1}'";
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)            
else
{
论Web控件开发 - 树状控件(二)                selectStr 
= "{0} = {1}";
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)            
try
{
论Web控件开发 - 树状控件(二)                System.Data.DataRow[] rows 
= table.Select(string.Format(selectStr,parentIDField,idValue));
论Web控件开发 - 树状控件(二)                
foreach(System.Data.DataRow row in rows)
{
论Web控件开发 - 树状控件(二)                    Keyss.WebControls.DropDownTreeItem item1 
= new Keyss.WebControls.DropDownTreeItem();
论Web控件开发 - 树状控件(二)                    item1.LoadFromDataRow(row);
论Web控件开发 - 树状控件(二)                    item.Items.Add(item1);
论Web控件开发 - 树状控件(二)                    LoadItemsFromTable(item1, row[idField], table, isStr, idField, parentIDField);
论Web控件开发 - 树状控件(二)                }

论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)            
catch
{
论Web控件开发 - 树状控件(二)                
throw new ArgumentException("Table or filed name error!",table.TableName);
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        Bindable(
true),
论Web控件开发 - 树状控件(二)        Category(
"Appearance"),
论Web控件开发 - 树状控件(二)        DefaultValue(
"&nbsp;&nbsp;&nbsp;")
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public string TabString 

论Web控件开发 - 树状控件(二)            
get 

论Web控件开发 - 树状控件(二)                
object o = ViewState["tabString"];
论Web控件开发 - 树状控件(二)                
return (o == null)?"&nbsp;&nbsp;&nbsp;":(string)o;
论Web控件开发 - 树状控件(二)            }
 
论Web控件开发 - 树状控件(二)            
set 

论Web控件开发 - 树状控件(二)                ViewState[
"tabString"= value; 
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        Bindable(
true),
论Web控件开发 - 树状控件(二)        Category(
"Appearance"),
论Web控件开发 - 树状控件(二)        DefaultValue(
"")
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public string SelectedValue 
{
论Web控件开发 - 树状控件(二)            
get 

论Web控件开发 - 树状控件(二)                
object o = ViewState["selectedValue"];
论Web控件开发 - 树状控件(二)                
return (o == null)?"":(string)o;
论Web控件开发 - 树状控件(二)            }
 
论Web控件开发 - 树状控件(二)            
set 

论Web控件开发 - 树状控件(二)                ViewState[
"selectedValue"= value; 
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        DefaultValue(
false),
论Web控件开发 - 树状控件(二)        NotifyParentProperty(
true), 
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public bool AutoPostBack 

论Web控件开发 - 树状控件(二)            
get 

论Web控件开发 - 树状控件(二)                
object o = ViewState["autoPostBack"];
论Web控件开发 - 树状控件(二)                
return (o == null)?false:(bool)o;
论Web控件开发 - 树状控件(二)            }
 
论Web控件开发 - 树状控件(二)            
set 

论Web控件开发 - 树状控件(二)                ViewState[
"autoPostBack"= value; 
论Web控件开发 - 树状控件(二)            }
 
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        DefaultValue(
false),
论Web控件开发 - 树状控件(二)        NotifyParentProperty(
true), 
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public bool SelectLeafOnly

论Web控件开发 - 树状控件(二)            
get 

论Web控件开发 - 树状控件(二)                
object o = ViewState["selectLeafOnly"];
论Web控件开发 - 树状控件(二)                
return (o == null)?false:(bool)o;
论Web控件开发 - 树状控件(二)            }
 
论Web控件开发 - 树状控件(二)            
set 

论Web控件开发 - 树状控件(二)                ViewState[
"selectLeafOnly"= value; 
论Web控件开发 - 树状控件(二)            }
 
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
论Web控件开发 - 树状控件(二)        Browsable(
false),
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public DropDownTreeItem SelectedItem
{

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        
private DropDownTreeItemStyleCollection _itemStyles;
论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        NotifyParentProperty(
true),
论Web控件开发 - 树状控件(二)        PersistenceMode(PersistenceMode.InnerProperty),
论Web控件开发 - 树状控件(二)        DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public DropDownTreeItemStyleCollection ItemStyles
{
论Web控件开发 - 树状控件(二)            
get 
{
论Web控件开发 - 树状控件(二)                
if(_itemStyles==null
{
论Web控件开发 - 树状控件(二)                    _itemStyles 
= new DropDownTreeItemStyleCollection();
论Web控件开发 - 树状控件(二)                    
if(this.IsTrackingViewState)
论Web控件开发 - 树状控件(二)                        _itemStyles.TrackViewState();
论Web控件开发 - 树状控件(二)                }

论Web控件开发 - 树状控件(二)                
return _itemStyles;
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        
private DropDownTreeItemCollection _items;
论Web控件开发 - 树状控件(二)        [
论Web控件开发 - 树状控件(二)        NotifyParentProperty(
true),
论Web控件开发 - 树状控件(二)        PersistenceMode(PersistenceMode.InnerProperty),
论Web控件开发 - 树状控件(二)        DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
论Web控件开发 - 树状控件(二)        ]
论Web控件开发 - 树状控件(二)        
public DropDownTreeItemCollection Items
{
论Web控件开发 - 树状控件(二)            
get 
{
论Web控件开发 - 树状控件(二)                
if(this._items ==null
{
论Web控件开发 - 树状控件(二)                    _items 
= new DropDownTreeItemCollection();
论Web控件开发 - 树状控件(二)                    
if(this.IsTrackingViewState)
论Web控件开发 - 树状控件(二)                        _items.TrackViewState();
论Web控件开发 - 树状控件(二)                }

论Web控件开发 - 树状控件(二)                
return _items;
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        
protected override void Render(HtmlTextWriter writer)
{
论Web控件开发 - 树状控件(二)            
if(Page != null)
论Web控件开发 - 树状控件(二)                Page.VerifyRenderingInServerForm(
this);
论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)            
if(!Items.IsEmpty)
{
论Web控件开发 - 树状控件(二)                
base.Render(writer);
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)            
else
{
论Web控件开发 - 树状控件(二)                
if((this.Site!=null)&&this.Site.DesignMode)
论Web控件开发 - 树状控件(二)                    writer.WriteLine(
this.ID);
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
protected override void RenderContents(HtmlTextWriter writer)
{
论Web控件开发 - 树状控件(二)            
foreach(DropDownTreeItem item in this.Items)
{
论Web控件开发 - 树状控件(二)                item.Render(writer);
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)        
protected override HtmlTextWriterTag TagKey
{
论Web控件开发 - 树状控件(二)            
get
{
论Web控件开发 - 树状控件(二)                
return HtmlTextWriterTag.Select;
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
论Web控件开发 - 树状控件(二)            
base.AddAttributesToRender (writer);
论Web控件开发 - 树状控件(二)            writer.AddAttribute(HtmlTextWriterAttribute.Name,
this.UniqueID);
论Web控件开发 - 树状控件(二)            
if(this.AutoPostBack)
{
论Web控件开发 - 树状控件(二)                writer.AddAttribute(
"language","javascript");
论Web控件开发 - 树状控件(二)                writer.AddAttribute(
"onchange",this.Page.GetPostBackClientEvent(this,string.Empty));
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        
protected override void LoadViewState(object state)
{
论Web控件开发 - 树状控件(二)            
if(state !=null)
{
论Web控件开发 - 树状控件(二)                
object[] savedState = (object[])state;
论Web控件开发 - 树状控件(二)                
if(savedState[0!= null)
论Web控件开发 - 树状控件(二)                    
base.LoadViewState(savedState[0]);
论Web控件开发 - 树状控件(二)                
if(savedState[1!= null)
论Web控件开发 - 树状控件(二)                    ItemStyles.LoadViewState(savedState[
1]);
论Web控件开发 - 树状控件(二)                
if(savedState[2!= null)
论Web控件开发 - 树状控件(二)                    Items.LoadViewState(savedState[
2]);
论Web控件开发 - 树状控件(二)            }
    
论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
protected override object SaveViewState()
{
论Web控件开发 - 树状控件(二)            
object[] savedState = new object[3];
论Web控件开发 - 树状控件(二)            savedState[
0= base.SaveViewState ();
论Web控件开发 - 树状控件(二)            savedState[
1= this.ItemStyles.SaveViewState();
论Web控件开发 - 树状控件(二)            savedState[
2= this.Items.SaveViewState();
论Web控件开发 - 树状控件(二)            
for(int i=0;i<savedState.Length;i++)
{
论Web控件开发 - 树状控件(二)                
if(savedState[i] != null)
论Web控件开发 - 树状控件(二)                    
return savedState;
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)            
return null;
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
protected override void TrackViewState()
{
论Web控件开发 - 树状控件(二)            
base.TrackViewState();
论Web控件开发 - 树状控件(二)            ItemStyles.TrackViewState();
论Web控件开发 - 树状控件(二)            Items.TrackViewState();
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        
protected override void OnInit(EventArgs e)
{
论Web控件开发 - 树状控件(二)            
base.OnInit (e);
论Web控件开发 - 树状控件(二)            
this.Items.Owner = null;
论Web控件开发 - 树状控件(二)            
this.Items.DropDownTree = this;
论Web控件开发 - 树状控件(二)            
this.Items.Init();
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)        
protected static readonly object EventSelectedIndexChanged = new object();
论Web控件开发 - 树状控件(二)        
public event System.EventHandler SelectedIndexChanged
{
论Web控件开发 - 树状控件(二)            add
{
论Web控件开发 - 树状控件(二)                Events.AddHandler(EventSelectedIndexChanged, value);
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)            remove
{
论Web控件开发 - 树状控件(二)                Events.RemoveHandler(EventSelectedIndexChanged, value);
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
protected virtual void OnSelectedIndexChanged(System.EventArgs e)
{
论Web控件开发 - 树状控件(二)            EventHandler selectedIndexChangedHandler 
= (EventHandler)Events[EventSelectedIndexChanged];
论Web控件开发 - 树状控件(二)            
if(selectedIndexChangedHandler!=null)
{
论Web控件开发 - 树状控件(二)                selectedIndexChangedHandler(
this,e);
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion

论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)        
public void RaisePostDataChangedEvent()
{
论Web控件开发 - 树状控件(二)            OnSelectedIndexChanged(System.EventArgs.Empty);
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
{
论Web控件开发 - 树状控件(二)            String presentValue 
= this.SelectedValue;
论Web控件开发 - 树状控件(二)            String postedValue 
= postCollection[this.UniqueID];
论Web控件开发 - 树状控件(二)
论Web控件开发 - 树状控件(二)            
if (presentValue == null || !presentValue.Equals(postedValue))
{
论Web控件开发 - 树状控件(二)                
this.SelectedValue = postedValue;
论Web控件开发 - 树状控件(二)                
return true;
论Web控件开发 - 树状控件(二)            }

论Web控件开发 - 树状控件(二)            
return false;
论Web控件开发 - 树状控件(二)        }

论Web控件开发 - 树状控件(二)        
#endregion
论Web控件开发 - 树状控件(二)    }

论Web控件开发 - 树状控件(二)}

论Web控件开发 - 树状控件(二)
由于时间有限,今天先把代码贴上以后有空再加注解:),你们如果哪些看不懂可以帮我留言:)

相关文章:

  • 2021-09-28
  • 2021-08-04
  • 2021-09-09
  • 2021-12-30
  • 2021-07-04
  • 2022-12-23
猜你喜欢
  • 2021-07-25
  • 2022-12-23
  • 2021-07-11
  • 2021-09-28
  • 2021-05-31
  • 2021-10-19
  • 2021-11-06
相关资源
相似解决方案