RadGrid - 我可以将列数据字段属性设置为枚举描述吗?

时间:2013-10-17 20:16:19

标签: asp.net vb.net data-binding enums radgrid

我正在尝试将“测试”实体列表绑定到下面的网格中。我可以通过为数据字段指定Person.Name来获取User列以读取Person类的Name属性。

但是,当我尝试通过将datafield属性设置为MyEnum.Description来让Desc列显示Enum值的描述时,我什么也得不到。没有错误,只是一个空白列。

这可能吗?我错过了什么吗?如果我在代码隐藏中做同样的事情,我会返回一个字符串“Hello”。

如果可以帮助,我宁愿在后面的代码中使用ItemDataBound事件。

Public Class Test

    Property MyPerson As Person
    Property MyEnum As HelloWorldEnum = HelloWorldEnum.Hi

    Public Enum HelloWorldEnum
        <ComponentModel.Description("Hello")> Hi
        <ComponentModel.Description("World")> Earth
    End Enum

End Class

Public Class Person
    Property Name As String
End Class

我的网格示例:

<telerik:radgrid id="grid" runat="server">
    <mastertableview>
        <Columns>
            <telerik:GridBoundColumn DataField="MyPerson.Name" HeaderText="User" />
            <telerik:GridBoundColumn DataField="MyEnum.Description" HeaderText="Desc" />
        </Columns>
    </mastertableview>
</telerik:radgrid>

更新:我很抱歉,我遗漏了一个事实,即我们创建了一个扩展方法来读取枚举上的description属性。因此我使用了.Description

<Extension()>
Public Function Description(ByVal theEnum As [Enum]) As String
    Dim fi As FieldInfo = theEnum.GetType().GetField(theEnum.ToString)
    Dim attributes() As DescriptionAttribute = DirectCast(fi.GetCustomAttributes(GetType(DescriptionAttribute), False), DescriptionAttribute())
    If attributes.Length > 0 Then
        Return attributes(0).Description
    Else
        Return theEnum.ToString
    End If
End Function

1 个答案:

答案 0 :(得分:1)

这与Telerik RadGrid无关。你需要一个帮助方法来获得枚举的描述。

Adding Descriptions to your Enumerations

public static string GetDescription(object enumValue, string defDesc)
{
  FieldInfo fi = enumValue.GetType().GetField(enumValue.ToString());

  if (null != fi)
  {
     object[] attrs = fi.GetCustomAttributes(typeof(DescriptionAttribute), true);
     if (attrs.Length > 0)
            return ((DescriptionAttribute)attrs[0]).Description;
  }
  return defDesc;
}

enter image description here

ASPX

<telerik:RadGrid ID="grid" runat="server" 
    OnNeedDataSource="grid_NeedDataSource" 
    AutoGenerateColumns="False">
    <MasterTableView>
        <Columns>
            <telerik:GridBoundColumn DataField="MyPerson.Name" 
                HeaderText="User" />
            <telerik:GridBoundColumn DataField="MyEnum" HeaderText="Value" />
            <telerik:GridTemplateColumn HeaderText="Desc" >
                <ItemTemplate>
                    <%# GetDescription(Eval("MyEnum"), "Nothing") %>
                </ItemTemplate>
            </telerik:GridTemplateColumn>
        </Columns>
    </MasterTableView>
</telerik:RadGrid>

ASPX.CS

public class Test
{

    public Person MyPerson { get; set; }
    public HelloWorldEnum MyEnum { get; set; }

    public enum HelloWorldEnum
    {
        [Description("Hello")]
        Hi,
        [Description("World")]
        Earth
    }
}

public class Person
{
    public string Name { get; set; }
}

protected void grid_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
{
    grid.DataSource = new List<Test>()
    {
        new Test
        {
            MyPerson = new Person {Name = "Jon"},
            MyEnum = Test.HelloWorldEnum.Earth
        }
    };
}