对于需求中一些不变的列表值,在系统中大家一般如何处理?
比如:
用户状态:隐身、空闲、忙碌、离线
会议重要级别:一般、重要、重大
等级:一级、二级、三级、四级、五级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.   

    写在类里面,被引用,如果你的需求发生变化,一样需要修改代码,并且重新编译,跟你写在页面上差别不在,顶多是需求发生变化之后,你只需要修改一个类文件,这种还是避免不了重新编译代码的。其实,第三个办法不错,如果你想图省事,就写在web.config的AppSetting配置节中,最好,你单独写一个xml文件,把这些固定的配置项放到配置文件中,写一个固定读取xml文件的方法,如果有了新的选项,只需要在xml中添加一个配置项就可以了。这篇博客写了c#读取xml文件的方法。
    http://blog.csdn.net/xuwenwu/archive/2008/05/26/2482863.aspx
      

  2.   

    枚举
    然后写一个可以反射枚举的泛型方法/// <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,我已经改良过另外一个版本,可惜不在 身边
      

  3.   

    我是这样写的:
    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="三级"}
                };
            }
        }
      

  4.   

    EnumBase是父类
    EnumInstance是类型的项
      

  5.   

    直接用枚举...enum 状态 {
    未知=0,
    隐身,
    空闲,
    忙碌,
    离线,
    }
      

  6.   

    这有什么不方便的,借用vrhero的那个枚举来举例:this.DropDownList1.Items.Clear();
    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);
    }
      

  7.   

    你这写法是很不方便...只需要两句...
    DropDownList1.DataSource  = Enum.GetNames(typeof(状态));
    DropDownList1.DataBind();
      

  8.   

    这就要看楼主是否需要枚举的值了,你这种写法绑定比较方便,但取出来的SelectedValue还是枚举的名称,他同样要转换
      

  9.   

    恩,  那样的话  Value和Text都是同一个了。
    使用或保存的时候需要装换。
      

  10.   

    取出转换只转换一个,不需要循环啊...另外,还可以用Attribute扩展,把text、value分开绑定,不但连转换都省了,还想加什么属性都可以...绝对比你用什么“公共的方法”灵活方便得多,也直观得多...
      

  11.   

    如何扩展?    还请vrhero大侠指点一下。
      

  12.   

    我现在就写在类中,然后有一个类专门用来将这些值添加到 HTML.SELECT ASP.DROPDOWNLIST 这些控件中。
    专门的类存储,专门的类解读,设置默认值 啥的,我感觉 挺 方便 的。和 楼主基本一样。不过我想如果可以不修改代码,也是个不错的方法。不过一般来讲这样够用了吧
      

  13.   

    按用户需求来嘛,这种东西用枚举我看起来就觉得不合适,首先这是个可更改的数据,不是什么程序逻辑,看起来这些数据修改也就是一般的管理员等级的用户行为,仅为一个数据就要让程序员改动程序明显不合适,又不是什么功能扩充,而且改动后还要上传DLL重新编译,就会造成诸如Session的丢失之类的事情.那会为添加一个数据去修改程序的.这些种诸如分类表之类的数据,一般来说会修改但不是经常,数据量也比较小,而且一般是管理级用户进行修改,然后普通用户使用,你完全可以写入数据库里面便于管理,同时每次一旦发生修改你的程序就该在修改后生成对应的静态文件生来实现不必频繁访问数据库的原则,要么生成XML做服务器端绑定,XML还可以便于查看,客户端还可以做AJAX的XML绑定,要么直接生成JS性能消耗抛给客户.
      

  14.   

    一般都用枚举来处理
    对于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 状态
    {
        未知,
        隐身,
        空闲,
        忙碌,
        离线
    }
      

  15.   


    可以给枚举项定义[Descript("属性")]作为Text的,如果全英文的可以直接用Name
    然后写一个静态方法进行绑定(现在知道静态方法了,可以直接扩展到DropDownList类型上去)
      

  16.   

    这样有点麻烦如果想要绑定方便的话
    我觉得可以写个装换的方法,每次绑定的时候可以先将枚举装换成形如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";