2017-05-23 14 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

をそして、それに基づいて、私はしたいと思いますグリッド上映表示するには、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フラグを3つのブール値に分割し、バインドできる別のDataTableを作成し、更新または挿入する前に変換をいくつか行います。

これを達成するためのより洗練された方法を誰も考えることができますか?私はIValueConverterを使用してWPFとXAMLでこのタイプのことを行うのが簡単だと考えていますが、私はASP.Netに精通していません。前もって感謝します!

+0

私の回答はあなたを助けましたか? – hardkoded

+0

@kblok私は引き離されて、これでまだ作業中です。これはおそらく受け入れられた答えではないでしょう。私はそれがバインディングにどのように役立つのか実際にはわかりませんが、有用なコードの場合は、ヘルパーメソッドを使ってデータを変換する方法を選択する必要があります。おそらく。 –

答えて

2

データベースの値を直接列挙型にキャストして文字列値を取得できます。

<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 
} 

その後、私はあなたがリストを通過する場合は、

GetEnumDescription((VisibleTo)myIntValue); 

を行うことができますので、この

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(); 
} 

を持っています次のようなことができます:

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