【问题标题】:How to map dropDownlist to enum in C#?如何在 C# 中将 dropDownlist 映射到枚举?
【发布时间】:2013-12-05 11:43:41
【问题描述】:

我已将下拉列表绑定到一周中的天数,如下所示:

    private void BindDayOfWeek()
    {
        this.ddlDayOfWeek.DataSource = GetWeekDays();
        this.ddlDayOfWeek.DataBind();
    }

    private List<DayOfWeek> GetWeekDays()
    {
        return Enum.GetValues(typeof(DayOfWeek)).Cast<DayOfWeek>().ToList();
    }

现在我想读取枚举 DayOfWeek 中所选工作日(从下拉列表中)的 int 值,即如果我从下拉列表中选择“星期日”,我应该能够选择“星期日”的 int 值枚举 DaysOfWeek(不是 ddlDayOfWeek.selectedValue 或 SelectedIndex)

如果没有开关,我怎么能做到这一点(我认为可以是一种方式)?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    由于SelectedValue 是一个字符串,您需要先将其解析为int。然后你只需要把它转换成DayOfWeek

    if(ddlDayOfWeek.SelectedIndex >= 0)
    {
        int selectedDay = int.Parse(ddlDayOfWeek.SelectedValue);
        DayOfWeek day = (DayOfWeek) selectedDay;
    }
    

    如果您不将DataTextFieldDataValueField 分开(您应该这样做),您可以通过Enum.ParseDropDownList 中显示的string "Sunday" 解析为DayOfWeek

    DayOfWeek selectedDay = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), ddlDayOfWeek.SelectedValue);
    

    编辑:这是一种如何从枚举中设置DataTextField/DataValueField 的方法:

    var weekDays = Enum.GetValues(typeof(DayOfWeek)).Cast<DayOfWeek>()
        .Select(dow => new { Value = (int)dow, Text = dow.ToString() })
        .ToList();
    ddlDayOfWeek.DataSource = weekDays;
    ddlDayOfWeek.DataTextField = "Text";
    ddlDayOfWeek.DataValueField = "Value";
    ddlDayOfWeek.DataBind();
    

    【讨论】:

    • 我明白了。即使 ddlDayOfWeek 在 DatavalueField 中仍然有星期名称,所以 DayOfWeek selectedDay 将是“星期日”(来自您的第二组代码)。如何从 Enum 获取“Sunday”的 int 值?
    • @sdeep:按照您目前的方法,我的第二种方法有效。如果您想将int 用作Value 并将日期名称用作Text,您可以使用我在答案中编辑的查询。
    【解决方案2】:
    private void BindDayOfWeek()
    {
        this.ddlDayOfWeek.DataSource = GetWeekDays();
        this.ddlDayOfWeek.DataTextField = DayOfWeek;
        this.ddlDayOfWeek.DataValueField = (int)DayOfWeek.ToString();
        this.ddlDayOfWeek.DataBind();
    }
    

    将您的绑定代码更改为上述代码。这样,下拉列表中的选定项目与所有项目一样,都将具有将显示给用户的文本值和该值的值,您可以在服务器端获取它。项目的属性值,将为您提供所选日期的编号。

    【讨论】:

    • @Stefano,不,我没有测试过。为什么?你看到任何错误吗?我唯一不绝对的是属性的名称。 DataTextField 和 DataValueField
    • @Christos DayOfWeek 没有 tostring() 方法。
    • @sdeep,对不起。我更正了我的帖子。谢谢。那工作知道吗?如果有任何问题,请告诉我。
    • 查看 Tim 对 DataTextField / DataValueField 的使用。它们应该是数据源属性的名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多