[下载源代码]
在使用ASP.NET开发Web应用程序时经常会需要用户从枚举类型中选择某一成员,使用DropDownList来处理这种场景比较合适,但同时DropDownList本身也存在一些限制,使其不能对枚举类型提供良好的支持。例如使用Enum.GetNames()方法可以将枚举成员的Text作为数据源绑定到DropDownList,但不能将成员的Value也实现绑定。因此考虑设计支持枚举类型数据源的控件——EnumDropDown。
我们主要通过重写DropDownList类型的DataSource属性和DataBind()方法实现上述功能。
重写DataSource属性
将DataSource属性重写为Type类型,以便控件可以获取希望绑定的枚举类型。
获取数据源
考虑到要同时绑定枚举成员的Text和Value,以及枚举成员与整型之间方便的进行转换,使用Dictionary<string, int>类型包装从给定的枚举类型中读取的数据作为DropDownList的数据源。
重写DataBind方法
参考文章:http://aspalliance.com/1514_Extending_the_DropDownList_to_Support_Enums
在使用ASP.NET开发Web应用程序时经常会需要用户从枚举类型中选择某一成员,使用DropDownList来处理这种场景比较合适,但同时DropDownList本身也存在一些限制,使其不能对枚举类型提供良好的支持。例如使用Enum.GetNames()方法可以将枚举成员的Text作为数据源绑定到DropDownList,但不能将成员的Value也实现绑定。因此考虑设计支持枚举类型数据源的控件——EnumDropDown。
我们主要通过重写DropDownList类型的DataSource属性和DataBind()方法实现上述功能。
重写DataSource属性
将DataSource属性重写为Type类型,以便控件可以获取希望绑定的枚举类型。
private Type m_enumType;
public new Type DataSource
{
get
{
return m_enumType;
}
set
{
m_enumType = value;
}
}
public new Type DataSource
{
get
{
return m_enumType;
}
set
{
m_enumType = value;
}
}
获取数据源
考虑到要同时绑定枚举成员的Text和Value,以及枚举成员与整型之间方便的进行转换,使用Dictionary<string, int>类型包装从给定的枚举类型中读取的数据作为DropDownList的数据源。
private Dictionary<string, int> GetDataSource()
{
Dictionary<string, int> retval = new Dictionary<string, int>();
string[] enumNames = Enum.GetNames(m_enumType);
for (int i = 0; i < enumNames.Length; i++)
{
retval.Add(enumNames[i], (int)Enum.Parse(m_enumType, enumNames[i]));
}
return retval;
}
{
Dictionary<string, int> retval = new Dictionary<string, int>();
string[] enumNames = Enum.GetNames(m_enumType);
for (int i = 0; i < enumNames.Length; i++)
{
retval.Add(enumNames[i], (int)Enum.Parse(m_enumType, enumNames[i]));
}
return retval;
}
重写DataBind方法
public override void DataBind()
{
base.DataSource = GetDataSource();
DataValueField = "Value";
DataTextField = "Key";
base.DataBind();
}
{
base.DataSource = GetDataSource();
DataValueField = "Value";
DataTextField = "Key";
base.DataBind();
}
参考文章:http://aspalliance.com/1514_Extending_the_DropDownList_to_Support_Enums