2017-05-23 74 views
1

我試圖找到最有效的模式,將ASP.Net窗體中的控件綁定到包含幾個枚舉作爲整數值的數據庫表中。例如,如果我在代碼中定義這些枚舉:如何綁定到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

並在此基礎上,我想能夠使用控制像一個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] 

我已經調查了幾個控制類型,以及避風港沒有發現任何可以讓我們輕鬆完成的事情,我也沒有在Google上發現任何建議。我能想到的最好方法是在Page_Load方法中查詢數據庫,使用輔助方法將鏈接類型int轉換爲可讀的字符串,並將VisibleTo標誌分解爲三個布爾值,並將所有這些加載到一個單獨的DataTable,我可以綁定,然後在更新或插入之前進行一些更多的轉換。

任何人都可以想到一個更優雅的方式來實現這一目標嗎?我正在考慮使用IValueConverter在WPF和XAML中完成這種類型的事情是多麼容易,但我不太熟悉ASP.Net。提前致謝!

+0

我的回答對你有幫助嗎? – hardkoded

+0

@kblok我被拉走了,我仍然在努力。這可能不會被接受的答案,因爲我真的不知道它如何幫助綁定,但+1有用的代碼,我應該選擇使用輔助方法轉換數據的方法,因爲我提到我威力。 –

回答

2

您可以將數據庫中的值直接轉換爲Enum並獲取它的字符串值。

<asp:TemplateField HeaderText="Link Type"> 
    <ItemTemplate> 
     <%# (LinkType)Convert.ToInt32(Eval("LinkType")) %> 
    </ItemTemplate> 
</asp:TemplateField> 
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"); 
    } 
}