【问题标题】:RadGrid - Can I set a column datafield property to an enum description?RadGrid - 我可以将列数据字段属性设置为枚举描述吗?
【发布时间】:2013-10-17 20:16:19
【问题描述】:

我正在尝试将“测试”实体列表绑定到下面的网格。通过为数据字段指定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

<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

【问题讨论】:

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


    【解决方案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;
    }
    

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

    【讨论】:

    • 我更新了我的问题以包括我们用来获取枚举描述的扩展方法。感谢您使用 Tempate 列的想法。这当然是我们可以走的一条路线。我仍在寻找关于为什么我不能直接在普通列的 DataField 属性中调用该扩展方法的答案。
    • 描述是一种扩展方法。尽管 VB 允许您编写 MyEnum.Description,但您不能使用 like 属性。正确的语法是 MyEnum.Description()现在我们回到原始问题 - 我们不能像这样在 DataField 中调用方法 - DataField="MyEnum.Description()"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 2023-03-27
    • 2017-02-16
    • 2010-12-05
    相关资源
    最近更新 更多