3

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

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

这可能吗?我错过了什么吗?如果我在代码隐藏中做同样的事情,我会返回一个“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.

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

1 回答 1

2

这与 Telerik RadGrid 无关。您需要一个辅助方法来获取枚举的描述。

向枚举添加描述

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

在此处输入图像描述

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
        }
    };
}
于 2013-10-17T23:14:06.470 回答