2009-02-24 4 views
2

Проблема: У меня есть перечисляемый тип, который имеет теги описания в следующем стиле: [URL = "http://xml.indelv.com/data-binding-enum.html "] description tutorial [/ URL]. У меня есть база данных Windows SQL Server, из которой я извлекаю данные (как целые числа, а затем castine в Enums), которые затем привязаны к datagrid. Вместо того, чтобы тянуть и обрезать перечисленные типы, я хотел бы показать связанный с ним тег описания в перечисляемом типе.Как связать пользовательское описание Enum с DataGrid

Вот ASP -

<asp:GridView ID="StatementGrid" runat="server" AutoGenerateColumns="false" DataKeyNames="statementID" OnRowDeleting="StatementGrid_onDeleting" AllowSorting="False"> 
       <Columns> 
        <asp:BoundField HeaderText="Type" SortExpression="type" DataField="TypeOfStatement" /> 
        <asp:HyperLinkField HeaderText="Statement" DataTextField="StatementText" DataNavigateUrlFormatString="~/Gateway/Statements/View.aspx?statementID={0}" SortExpression="statement" DataNavigateUrlFields="statementID" /> 
        <asp:HyperLinkField DataNavigateUrlFields="statementID" DataNavigateUrlFormatString="~/Gateway/Statements/Update.aspx?statementID={0}" NavigateUrl="~/Gateway/Statements/Update.aspx" HeaderText="Edit" Text="<img src='../../Images/News/news_edit.gif' alt='Edit Statement'/>" /> 
        <asp:TemplateField HeaderText="Delete"> 
         <ItemTemplate> 
          <asp:ImageButton AlternateText="Delete Statement" ID="DeleteButton" ImageUrl="~/Images/News/news_delete.gif" runat="server" CommandName="Delete" OnClientClick="javascript:return confirm('Are you sure you want to delete this statement?');" /> 
         </ItemTemplate> 
        </asp:TemplateField> 
       </Columns> 
       <EmptyDataTemplate> 
        There are no statements to display. 
       </EmptyDataTemplate> 
      </asp:GridView> 

Вот код для Bind -

[КОД]

private void BindData() 
     { 
      IStatementDao statementDao = DaoFactory.GetStatementDao(); 
      List<Statement> statements; 

      if (Page.Request.RawUrl.Contains("Gateway")) 
      { 
       statements = statementDao.GetAll(); 

       StatementGrid.HeaderStyle.CssClass = "GatewayGridHeader"; 
       StatementGrid.AlternatingRowStyle.CssClass = "GatewayGridAlternatingRow"; 

      } 
      else 
      { 
       // This should never be reached but it keeps the compiler happy!! 
       statements = statementDao.GetAll(); 
      } 

      StatementGrid.DataSource = statements; 
      StatementGrid.DataBind(); 
      DisplayTypeDescriptors(); 
     } 

[/ CODE]

Вот перечисленном класс -

[CODE]

public enum TypeOfStatement 
     { 
      [EnumDescription("Dress Code")] DressCode = 1, 
      [EnumDescription("Lunch Time")] LunchTime = 2, 
      [EnumDescription("Footwarez")] Footware = 3, 
      [EnumDescription("achtung")] Warning = 4, 
      [EnumDescription("Banarna")] Banana = 5, 
      [EnumDescription("Apfel")] Apple = 6 
     };c# 

[/ CODE]

Это очевидно, что можно было бы написать обширный метод действительно делать то, что я хочу, но есть аккуратнее способ?

+0

надеюсь, что код был полезным :) – ShuggyCoUk

ответ

1

Оберните их на лету и тонко измените свою обработку SelectedItem (или что бы вы ни использовали)
В моем примере используется уже существующий атрибут Description.

public class DescriptiveEnum<T> where T: struct 
{ 
    private static readonly Dictionary<T,string> descriptions 
     = new Dictionary<T,string>(); 

    static DescriptiveEnum() 
    { 
     foreach (FieldInfo field in 
      typeof(T).GetFields(BindingFlags.Static 
      | BindingFlags.GetField | BindingFlags.Public)) 
     { 
     descriptions.Add((T)field.GetRawConstantValue(), 
      LookupName(field));   
     } 
    } 

    public readonly T Value; 

    public DescriptiveEnum(T value) 
    { 
     this.Value = value;  
    } 

    public override string ToString() 
    { 
     string s; 
     if (!descriptions.TryGetValue(this.Value, out s)) 
     {   
     // fall back for non declared fields 
     s = this.Value.ToString(); 
     descriptions[this.Value] = s; 
     } 
     return s; 
    } 

    private static string LookupName(FieldInfo field)   
    { 
     object[] all = field.GetCustomAttributes(
      typeof(DescriptionAttribute), false); 
     if (all.Length == 0) 
      return field.Name; // fall back 
     else 
      return ((DescriptionAttribute)all[0]) 
       .Description; // only one needed 
    } 

    public static BindingList<DescriptiveEnum<T>> Make(
     IEnumerable<T> source) 
    { 
     var list = new BindingList<DescriptiveEnum<T>>(); 
     foreach (var x in source) 
     list.Add(new DescriptiveEnum<T>(x)); 
     return list; 
    } 
} 

Пример использования:

public enum Foo 
{ 
    [Description("flibble")] 
    Bar, 
    [Description("wobble")] 
    Baz, 
    // none present, will use the name 
    Bat 

} 

Form f = new Form(); 
f.Controls.Add(new ListBox() 
{ 
    Dock = DockStyle.Fill, 
    DataSource = DescriptiveEnum<Foo>.Make(
     new Foo[] { Foo.Bar, Foo.Baz, Foo.Bat }), 
}); 
Application.Run(f); 
Смежные вопросы