在我们进行的项目开发中,经常会遇到类似“状态(status)”这样的“常量”吧。比如说用户的状态可以简单的分为:正常,异常或者注销三类。如果没有事先定义好,或者定义好了,开发人员记忆混淆了,很可能就会造成错误,那么怎么样才能避免这样简单的错误呢。应该首先想到的是枚举,定义死了,以后开发人员用的时候就会去调用那个枚举就好了,关于枚举的好处就不说了,网上好多的。枚举定义好了,那么如何绑定到下拉的列表呢,在网上上收集了一些资料,现在整理如下:
首先,定义一个类型自定义属性(Attribute)
这个类是用来定义枚举中的自定义属性的,我们定义了两个属性,一个是描述,还有一个是值,分别表示下拉中的显示值和value值
public class EnumDescription : Attribute
{
readonly string description;
readonly string value;
public EnumDescription(string description,string value)
{
this.description = description;
this.value = value;
}
/// <summary>
/// 枚举描述
/// </summary>
public string Description
{
get { return description; }
}
/// <summary>
/// 枚举值
/// </summary>
public string Value
{
get { return value; }
}
}
第二步,确定枚举
在这个枚举中使用了我们自定义的枚举属性
/// <summary>
/// 用户角色
/// </summary>
public enum UserRole
{
[EnumDescription("普通用户","1")]
Member =1,
[EnumDescription("公司","2")]
Company = 2,
[EnumDescription("超级管理员","5")]
WebSiteManager =3
}
第三步,我们封装了一个方法,利用反射的技术,将数据绑定到下拉列表中
这个是摘自网名为阿松的人的代码,经过自己简单的修改后得到的,下面有两个方法,一个是用来绑定下拉列表的,还有一个是用来转换数据库中的值和要显示的值的
public class EnumBind
{
/// <summary>
/// 用枚举绑定列表
/// 作者:阿松
/// </summary>
/// <param name="col">控件名</param>
/// <param name="eumeName">枚举名</param>
/// <param name="eumeName">是否显示全部</param>
public void ControlBindData(Control col, string enumName,bool showAll)
{
System.Reflection.Assembly asm = Assembly.Load("App_Code"); //枚举是在App_Code里
Type type = asm.GetType(enumName);
FieldInfo[] fields = type.GetFields();
int count = fields.Length;
if (col is DropDownList)
{
DropDownList ddl = (DropDownList)col;
ddl.Items.Clear();
if (showAll)//是否显示“全部”
{
ddl.Items.Add(new ListItem("全部", ""));
}
for (int i = 1; i < count; i++)
{
FieldInfo field = fields[i];
string key = String.Empty;
string value = String.Empty;
////////////////
var attr = field.GetCustomAttributes(false) ;
foreach (Attribute a in attr)
{
if (a is EnumDescription)
{
key = ((EnumDescription)a).Description;
value = ((EnumDescription)a).Value;
}
}
/////////
ListItem item = new ListItem(key,value);
ddl.Items.Add(item);
}
}
else if (col is HtmlSelect)
{
HtmlSelect ddl = (HtmlSelect)col;
ddl.Items.Clear();
for (int i = 1; i < count; i++)
{
FieldInfo field = fields[i];
ListItem item = new ListItem(field.Name);
ddl.Items.Add(item);
}
}
else if (col is CheckBoxList)
{
CheckBoxList ddl = (CheckBoxList)col;
ddl.Items.Clear();
for (int i = 1; i < count; i++)
{
FieldInfo field = fields[i];
ListItem item = new ListItem(field.Name);
ddl.Items.Add(item);
}
}
else if (col is RadioButtonList)
{
RadioButtonList ddl = (RadioButtonList)col;
ddl.Items.Clear();
for (int i = 1; i < count; i++)
{
FieldInfo field = fields[i];
ListItem item = new ListItem(field.Name);
ddl.Items.Add(item);
}
}
else if (col is ListBox)
{
ListBox ddl = (ListBox)col;
ddl.Items.Clear();
for (int i = 1; i < count; i++)
{
FieldInfo field = fields[i];
ListItem item = new ListItem(field.Name);
ddl.Items.Add(item);
}
}
}
/// <summary>
/// 枚举转换 将值转换为描述
/// </summary>
/// <returns></returns>
public static string Shift(string enumName,string myvalue)
{
System.Reflection.Assembly asm = Assembly.Load("App_Code"); //枚举是在App_Code里
Type type = asm.GetType(enumName);
FieldInfo[] fields = type.GetFields();
for (int i = 1; i < fields.Count(); i++)
{
FieldInfo field = fields[i];
var attr = field.GetCustomAttributes(false);
foreach (Attribute a in attr)
{
if (a is EnumDescription)
{
string key = ((EnumDescription)a).Description;
string value = ((EnumDescription)a).Value;
if (value.Equals(myvalue.Trim()))
{
return key;
}
}
}
}
return "";
}
第四步,在后台代码中使用
new EnumBind().ControlBindData(ddl_role, "MyCar.Web.UserRole",true); 绑定下拉列表的
<%# EnumBind.Shift("MyCar.Web.UserRole", ((User)Container.DataItem).role)%> 这是在aspx页面中转换数据中的值的
详细参考案例:RentalCar项目 (注:这是个人参考项目,网友可以自己按照这四步去做个实例)
资料来源:暂时忘记了,下次看到补上,呵呵
分享到:
相关推荐
为了将枚举绑定到UI控件,例如一个下拉列表框(ComboBox),你可以这样做: ```csharp // 初始化枚举项并添加到ComboBox foreach (var enumValue in Enum.GetValues(typeof(Color))) { comboBox.Items.Add(new ...
本文将详细介绍如何利用反射将枚举绑定到下拉框,例如ComboBox控件,以提高代码的可复用性和灵活性。 首先,枚举(enum)是C#中用于定义一组相关常量的类型,它们通常用于表示一组有限的、预定义的值。在本例中,...
这不仅涉及HTML和ASP.NET服务器控件的基本使用,还深入到了C#编程的高级特性,如事件处理、反射和枚举操作。通过这样的技术组合,开发人员能够轻松地为用户提供一个直观、美观且功能丰富的界面组件,极大地提升了...
1. **ComboBox**: ComboBox是Windows Forms或WPF中的一种常用控件,它结合了TextBox和ListBox的功能,用户可以输入文本或者从下拉列表中选择一个选项。 2. **Tooltip**: Tooltip是一种小型信息提示,当鼠标悬停在...
其次,`EnumToIEnumerableConverter` 类同样实现了 `IValueConverter`,用于将枚举值转换为 `IEnumerable` 集合,这通常用于下拉列表或复选框组等控件,使得所有枚举值可以作为可选择的选项。在 `Convert` 方法中,...
例如,创建一个对象实例后,可以使用Reflect.get和Reflect.set来动态读取和设置属性,使用Reflect.has来检查属性是否存在,使用Reflect.ownKeys来获取对象所有属性键的列表等。 此外,反射机制也常用于框架和库的...
例如,数值型属性可能用输入框,布尔值用复选框,枚举值用下拉列表。 4. **属性编辑器**:某些属性可能需要自定义的编辑器,如颜色选择器、日期选择器等。这需要实现编辑器工厂模式,根据属性类型动态生成相应的...
在.NET Framework中,`ColorComboBox` 是一个自定义控件,它是 `ComboBox` 的子类,主要用于提供一个显示颜色的下拉列表。这个控件在Windows Forms应用程序中非常有用,可以方便地让用户从一系列预定义的颜色中进行...
例如,一个文本框可能对应于实体的一个字段,一个下拉列表可能对应于实体的枚举类型。项目提供的工具或库可以自动生成这些转换代码,使得开发者无需手动编写,从而节省了大量时间。 实现这一功能的关键技术包括反射...
13.10 下拉列表 13.11 列表框 13.12 布局的控制 13.13 action的替用品 13.14 程序片的局限 13.14.1 程序片的优点 13.15 视窗化应用 13.15.1 菜单 13.15.2 对话框 13.16 新型 13.16.1 新的事件模型 13.16.2 事件和...
13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 ...
13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 13.14 程序片...
13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 13.14 程序片...
13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 13.14 程序片...
13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 13.14 程序片...
13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 13.14 程序片...
13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 13.14 程序片...
13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 13.14 程序片...
13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 13.14 程序片...
13.10 下拉列表 13.11 列表框 13.11.1 handleEvent() 13.12 布局的控制 13.12.1 FlowLayout 13.12.2 BorderLayout 13.12.3 GridLayout 13.12.4 CardLayout 13.12.5 GridBagLayout 13.13 action的替用品 13.14 程序片...