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

C# 如何在ASP.Net中将枚举绑定到网格控件,c#,asp.net,enums,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 =

我试图找到一种最有效的模式,将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        
}
然后,我的数据库表中的一行可能如下所示:

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

基于此,我希望能够使用类似DetailsView的控件和SQLDataSource来显示网格,其中显示:

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]
我已经研究了一些控件类型,但没有发现任何可以让这项工作轻松完成的东西,也没有找到任何关于谷歌的建议。我能想到的最好的方法是在Page_Load方法中查询数据库,使用helper方法将链接类型int转换为人类可读的字符串,并将VisibleTo标志分解为三个布尔值,然后将所有这些内容加载到我可以绑定的单独DataTable中,然后在更新或插入之前再进行一些转换


有人能想出一个更优雅的方法来实现这一点吗?我在想使用IValueConverter在WPF和XAML中实现这类功能是多么容易,但我对ASP.Net不太熟悉。提前谢谢

您可以将数据库中的值直接强制转换为枚举,并获取其字符串值

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

我所做的是:

[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");
    }
}

我的回答对你有帮助吗?@kblok我被拉走了,我还在努力解决这个问题。这可能不是公认的答案,因为我不知道它对绑定有什么帮助,但是+1对于有用的代码,我应该选择使用helper方法来转换数据,就像我提到的那样。