C# 如何在ASP.Net中将枚举绑定到网格控件
我试图找到一种最有效的模式,将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 =
[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方法来转换数据,就像我提到的那样。