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

其界面如下:

其功能如下:

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

其开发原刑如下:



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

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

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.Design;
using System.Drawing.Design;
using System.Drawing;

using System.ComponentModel;
using System.ComponentModel.Design;

namespace Keyss.WebControls
{    
    [TypeConverter(
typeof(ExpandableObjectConverter))]
    
public class DropDownTreeItemStyle:ViewStatePartBase
    
{
        
const
        
field
        
render
        
copy merge
    }

}

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

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.Design;
using System.Drawing.Design;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;

namespace Keyss.WebControls
{
    [ 
    PersistenceMode(PersistenceMode.InnerProperty),
    ] 
    
public class DropDownTreeItemStyleCollection:ViewStatePartCollectionBase
    
{

        
public int Add(DropDownTreeItemStyle item)
        
{
            
return base.AddItem(item);
        }

        
public DropDownTreeItemStyle this[int index]
        
{
            
get 
            
{
                
if(index >= Count || index < 0)
                
{
                    
return null;
                }

                
return (DropDownTreeItemStyle)this.InnerList[index];
            }

        }

        
protected override ViewStatePartBase NewItem()
        
{
            
return new DropDownTreeItemStyle();
        }


    }

}

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

以下是DropDownTreeItem的实现

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.Design;
using System.Drawing.Design;
using System.Drawing;

using System.ComponentModel;
using System.ComponentModel.Design;

namespace Keyss.WebControls
{
    
public class DropDownTreeItem:ViewStatePartBase
    
{
        
const
        
public field
        
DropDownTreeItemStyle
        
DropDownTree, Owner, Level
        
Items        
        
render
        
IStateManager 成员
        
Init
        
load from table
    }

}


以下是DropDownTreeItemCollection的源代码

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.Design;
using System.Drawing.Design;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
namespace Keyss.WebControls
{
    
public class DropDownTreeItemCollection:ViewStatePartCollectionBase
    
{
        
DropDownTree, Owner, Level
        
collection
        
render
        
init
        
newitem
    }

}


最后是DropDownTree的代码
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;

namespace Keyss.WebControls
{
    [
    ParseChildren(
true),
    ValidationPropertyAttribute(
"SelectedValue"),
    PersistChildren(
false),
    DefaultProperty(
"Items"),
    ToolboxData(
"<{0}:DropDownTree runat=server></{0}:DropDownTree>")]
    
public class DropDownTree : System.Web.UI.WebControls.WebControl,IPostBackDataHandler
    
{
        
loaddata from table
        
public field
        
DropDownTreeItemStyles
        
items
        
render
        
view State
        
init
        
event
        
IPostBackDataHandler 成员
    }

}

由于时间有限,今天先把代码贴上以后有空再加注解:),你们如果哪些看不懂可以帮我留言:)