如何将枚举绑定到ASP.Net中的网格控件

时间:2017-05-23 16:24:38

标签: c# asp.net enums

我正在尝试找到一种最有效的模式,用于将ASP.Net表单中的控件绑定到包含两个枚举作为整数值的数据库表。例如,如果我在代码中定义了这些枚举:

[Flags]
public enum VisibleTo
{
    None = 0,
    Customers = 1,
    Employees = 2,
    Managers = 4
}

public enum LinkType
{
    AdorableCatVideo = 0,
    Selfie = 1,
    FakeNews = 2,
    Pornography = 3        
}

然后我的数据库表中的一行可能如下所示:

sample SQL row

基于此,我希望能够像使用带有SQLDataSource的DetailsView一样使用控件来显示一个网格,显示:

Link Text: Kitten Playing With Yarn
Link URL: http://www.kittens.com/yarn134323.html
Link Type: AdorableKittenVideo (preferably with spaces)
Visible to Customers: [check]
Visible to Employees: [check]
Visible to Managers: [check]

我已经研究了一些控件类型,但没有找到任何可以轻松完成的内容,也没有在Google上找到任何建议。我能想到的最好的方法是在Page_Load方法中查询数据库,使用辅助方法将Link Type int转换为人类可读的字符串,并将VisibleTo标志分解为三个布尔值,并将所有这些加载到我可以绑定一个单独的DataTable,然后在更新或插入之前再做一些转换。

有人能想出更优雅的方式来实现这一目标吗?我在想使用IValueConverter在WPF和XAML中做这种类型的事情是多么容易,但我对ASP.Net并不熟悉。提前谢谢!

2 个答案:

答案 0 :(得分:2)

您可以将数据库中的值直接转换为Enum并获取它的字符串值。

<asp:TemplateField HeaderText="Link Type">
    <ItemTemplate>
        <%# (LinkType)Convert.ToInt32(Eval("LinkType")) %>
    </ItemTemplate>
</asp:TemplateField>

答案 1 :(得分:1)

我的工作是:

[Flags]
public enum VisibleTo
{
    [Description("None")]
    None = 0,
    [Description("Customers")]
    Customers = 1,
    [Description("Employees")]
    Employees = 2,
    [Description("Managers")]
    Managers = 4
}

然后我有了这个

public static string GetEnumDescription(Enum en)
{
    var type = en.GetType();
    var memInfo = type.GetMember(en.ToString());

    if (memInfo.Length > 0)
    {
        var attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

        if (attrs.Length > 0)
        {
            return ((DescriptionAttribute)attrs[0]).Description;
        }
    }

    return en.ToString();
}

那么你可以做到

GetEnumDescription((VisibleTo)myIntValue);

如果您想浏览列表,可以执行以下操作:

var visibleCheck = (VisibleTo)intFromDb;
foreach (var visibleItem in new[] { VisibleTo.Customers, VisibleTo.Employees, VisibleTo.Managers })
{
    if(visibleCheck.HasFlag(visibleItem) 
    {
        Console.WriteLine($"{GetEnumDescription(visibleItem)}: CHECKED");
    }
}