对于需求中一些不变的列表值,在系统中大家一般如何处理?
比如:
用户状态:隐身、空闲、忙碌、离线
会议重要级别:一般、重要、重大
等级:一级、二级、三级、四级、五级1、存到到数据库,使用的时候读取绑定?万一需求变了,很容易处理。但是,要连数据库,你懂得。this.DropDownList1.DataSource = SqlHelper.GetListData();
this.DropDownList1.DataValueField = "ItemValue";
this.DropDownList1.DataTextField = "ItemText";
this.DropDownList1.DataBind();
2、直接写在页面? 最直观、最方便,如果页面多的话,写起来比较烦。万一需求变了,Oh! my God!<asp:DropDownList ID="DropDownList3" runat="server">
<asp:ListItem Value="1" Text="一般"></asp:ListItem>
<asp:ListItem Value="2" Text="重要"></asp:ListItem>
<asp:ListItem Value="3" Text="重大"></asp:ListItem>
</asp:DropDownList>
3、写在配置文件中? 你有这样做吗?
省略......4、其它办法?5、我的办法是写在类中。
对每一类型,写一个对应的类。
比如,就等级来说。我会写一个LevelType类,将Key和Value都写在类中。
当然我会写个父类,封装了一些常用的方法。String GetTextByValue(string value);
String GetValueByText(string text);
InstanceType GetInstanceByValue();
string[] GetValues();
string[] GetTexts();
List<InstanceType> GetListData();
获取绑定的代码就这样写:Demo demo=new Demo();
this.DropDownList1.DataSource = demo.GetListData();
this.DropDownList1.DataValueField = "ItemValue";
this.DropDownList1.DataTextField = "ItemText";
this.DropDownList1.DataBind();
this.DropDownList1.SelectedValue = Demo.Level1; //默认选择一级
来了你就说说吧。
比如:
用户状态:隐身、空闲、忙碌、离线
会议重要级别:一般、重要、重大
等级:一级、二级、三级、四级、五级1、存到到数据库,使用的时候读取绑定?万一需求变了,很容易处理。但是,要连数据库,你懂得。this.DropDownList1.DataSource = SqlHelper.GetListData();
this.DropDownList1.DataValueField = "ItemValue";
this.DropDownList1.DataTextField = "ItemText";
this.DropDownList1.DataBind();
2、直接写在页面? 最直观、最方便,如果页面多的话,写起来比较烦。万一需求变了,Oh! my God!<asp:DropDownList ID="DropDownList3" runat="server">
<asp:ListItem Value="1" Text="一般"></asp:ListItem>
<asp:ListItem Value="2" Text="重要"></asp:ListItem>
<asp:ListItem Value="3" Text="重大"></asp:ListItem>
</asp:DropDownList>
3、写在配置文件中? 你有这样做吗?
省略......4、其它办法?5、我的办法是写在类中。
对每一类型,写一个对应的类。
比如,就等级来说。我会写一个LevelType类,将Key和Value都写在类中。
当然我会写个父类,封装了一些常用的方法。String GetTextByValue(string value);
String GetValueByText(string text);
InstanceType GetInstanceByValue();
string[] GetValues();
string[] GetTexts();
List<InstanceType> GetListData();
获取绑定的代码就这样写:Demo demo=new Demo();
this.DropDownList1.DataSource = demo.GetListData();
this.DropDownList1.DataValueField = "ItemValue";
this.DropDownList1.DataTextField = "ItemText";
this.DropDownList1.DataBind();
this.DropDownList1.SelectedValue = Demo.Level1; //默认选择一级
来了你就说说吧。
http://blog.csdn.net/xuwenwu/archive/2008/05/26/2482863.aspx
然后写一个可以反射枚举的泛型方法/// <summary>
/// 扩展方法:使用枚举填充ListControl的Items,枚举类型是int类型
/// </summary>
/// <typeparam name="TEnum"></typeparam>
/// <param name="control"></param>
public static void FillItemsByEnum<TEnum>(this ListControl control) where TEnum : struct
{
Type theEnum = typeof(TEnum);
string[] names = Enum.GetNames(theEnum);
foreach (string name in names)
{
int value=(int)Enum.Parse(theEnum,name);
ListItem item = new ListItem(name, value.ToString());
control.Items.Add(item);
}
}这个方法只能使用枚举为基型为int,我已经改良过另外一个版本,可惜不在 身边
public class LevelType : EnumBase
{
public static readonly string Level1 = "Level1";
public static readonly string Level2 = "Level2";
public static readonly string Level3 = "Level3";
public LevelType()
{
base.list = new EnumInstance[]
{
new EnumInstance(){ ItemValue=Level1, ItemText="一级"},
new EnumInstance(){ItemValue=Level2, ItemText="二级"},
new EnumInstance(){ItemValue=Level3, ItemText="三级"}
};
}
}
EnumInstance是类型的项
未知=0,
隐身,
空闲,
忙碌,
离线,
}
string[] names = Enum.GetNames(typeof(状态));
foreach (string name in names)
{
ListItem li = new ListItem();
li.Text = name;
li.Value = ((int)Enum.Parse(typeof(CountState), name)).ToString();
this.DropDownList1.Items.Add(li);
}
DropDownList1.DataSource = Enum.GetNames(typeof(状态));
DropDownList1.DataBind();
使用或保存的时候需要装换。
专门的类存储,专门的类解读,设置默认值 啥的,我感觉 挺 方便 的。和 楼主基本一样。不过我想如果可以不修改代码,也是个不错的方法。不过一般来讲这样够用了吧
对于value和text值一致的话可以通过databound事件来处理
public partial class DropDown_Enum : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
DropDownList1.DataSource = Enum.GetNames(typeof(状态));
DropDownList1.DataBind();
}
protected void DropDownList1_DataBound(object sender, EventArgs e)
{
ListControl list = sender as ListControl;
int i = 0;
foreach (ListItem l in list.Items)
{
l.Value = i.ToString();
i++;
}
}
}
public enum 状态
{
未知,
隐身,
空闲,
忙碌,
离线
}
可以给枚举项定义[Descript("属性")]作为Text的,如果全英文的可以直接用Name
然后写一个静态方法进行绑定(现在知道静态方法了,可以直接扩展到DropDownList类型上去)
我觉得可以写个装换的方法,每次绑定的时候可以先将枚举装换成形如DataTablepublic static DataTable ConvertEnumToDataTable(Type enumType)
{
DataTable dt = new DataTable();
DataColumn dcValue = new DataColumn("ItemValue",typeof(string));
DataColumn dcText = new DataColumn("ItemText",typeof(string));
dt.Columns.Add(dcValue);
dt.Columns.Add(dcText);
Array nameArr = Enum.GetValues(enumType);
for (int i = 0; i < nameArr.Length; i++)
{
DataRow dr = dt.NewRow();
dr["ItemText"] = nameArr.GetValue(i);
dr["ItemValue"] =(int)Enum.Parse(enumType, nameArr.GetValue(i).ToString());
dt.Rows.Add(dr);
}
return dt;
}this.DropDownList5.DataSource =EnumHelper.ConvertEnumToDataTable(typeof(State));
this.DropDownList5.DataTextField = "ItemText";
this.DropDownList5.DataValueField = "ItemValue";