如何在网格行中显示枚举描述或名称?

Posted

技术标签:

【中文标题】如何在网格行中显示枚举描述或名称?【英文标题】:How to display enum description or name in a grid row? 【发布时间】:2013-11-05 17:20:32 【问题描述】:

我在我的 ASP.Net MVC 应用程序中使用 Kendo 网格。如果我有以下网格定义,

@(html.Kendo().Grid(Model) //Bind the grid to ViewBag.Products
  .Name("grid")
  .Columns(columns =>
  
      columns.Bound(p => p.FullName);
      columns.Bound(p => p.MyEnum)
  )
  .Groupable()
  .Pageable()
  .Sortable()
  .Scrollable(scr => scr.Height(600))
  .Filterable()
  )

其中一列是枚举。我的枚举定义是:

public enum MyEnum

    [Display(AutoGenerateField = false, Name = "My enum 1", Description = "My Enum 1")]
    EnumOne,
    [Display(Name = "My Enum 2")]
    EnumTwo

如何让它在每一行显示“我的枚举 1”或“我的枚举 2”?

提前致谢!

【问题讨论】:

【参考方案1】:

我最近遇到了这个问题并通过使用解决了它

var someArrayOfValueAndText = new[] new  
    Id = 0, Description = "Foo"
, new  
    Id = 1, Description = "Bar"

.Columns(c.ForeignKey(m=> m.MyEnum, someArrayOfValueAndText, "Id","Description"))

而不是 .Bound 方法

【讨论】:

数组声明放在哪里? 如果您需要可导出网格,这将不起作用。不调用 JS 函数,只导出数据。【参考方案2】:

不久前我创建了一个包含一些扩展方法的辅助类:

public static class EnumExtensions

    public static string GetDisplayName(this Enum enu)
    
        var attr = GetDisplayAttribute(enu);
        return attr != null ? attr.Name : enu.ToString();
    

    public static string GetDescription(this Enum enu)
    
        var attr = GetDisplayAttribute(enu);
        return attr != null ? attr.Description : enu.ToString();
    

    private static DisplayAttribute GetDisplayAttribute(object value)
    
        Type type = value.GetType();
        if (!type.IsEnum)
        
            throw new ArgumentException(string.Format("Type 0 is not an enum", type));
        

        // Get the enum field.
        var field = type.GetField(value.ToString());
        return field == null ? null : field.GetCustomAttribute<DisplayAttribute>();
    

它包含两种提取Display 属性的NameDescription 的方法。显示名称:

columns.Bound(p => p.MyEnum.GetDisplayName())

关于描述:

columns.Bound(p => p.MyEnum.GetDescription())

您必须在 Web.config 或视图中添加 using 语句。

更新

如果你在你的模型中为它​​创建一个属性会怎样:

public string MyEnumName

    get  return MyEnum.GetDisplayName(); 

现在你应该可以使用了:

columns.Bound(p => p.MyEnumName);

【讨论】:

我尝试了上述方法,但在运行应用程序时出现错误。错误是“绑定列需要字段或属性访问表达式。”。感谢您的快速回复! 如果像上面这样绑定,是不是就不能使用网格的过滤能力了?目前,由于它绑定到一个实际的枚举,我得到一个组合框,其中包含所有不同的枚举值,以在过滤器菜单中进行选择。 @wm_ 过滤确实不再起作用了。也许 Kendo 网格提供了一些功能来自定义单元格中的数据?我没有这方面的经验。对不起。 不用担心。非常感谢您的帮助!【参考方案3】:

Henk 的解决方案很好。但是,如果您使用 ClientTemplate,您可以使用过滤功能:

col.Bound(m => m.MyEnum)              // this provides you filtering
   .ClientTemplate("#: MyEnumName #") // this shows a name of enum

有关剑道 ui 模板的更多信息,请参阅:http://docs.telerik.com/kendo-ui/framework/templates/overview

【讨论】:

完美。为我工作。【参考方案4】:

我使用@user1967246 方法,想详细说明我该怎么做。

我在剑道网格顶部创建了数组

    var statusLikeEntityStatus = new[]
    
        new Id = 0, Status = EntityStatus.Passive,
        new Id = 1, Status = EntityStatus.Active,
        new Id = 2, Status = EntityStatus.Draft,
        new Id = 3, Status = EntityStatus.ReadyToLive,
        new Id = -1, Status = EntityStatus.Freezed,
        new Id = -2, Status = EntityStatus.Blocked
    ;

然后我使用 ForeignKey 属性而不是 Bound。

     columns.ForeignKey(m => m.Status, statusLikeEntityStatus, "Id", "Status").Title(Resources.General.Status);

这是我的列属性

.Columns(columns =>
      
          columns.Bound(m => m.InventoryID).Title("Id");
          columns.Bound(m => m.ERPCode).Title(Resources.Products.ProductCode);
          columns.Bound(m => m.Price).Title(Resources.Products.ListPrice);
          columns.Bound(m => m.Discount).Title(Resources.Products.
          columns.Bound(m => m.Stock).Title(Resources.Products.TotalStock); // todo: Resources
          columns.ForeignKey(m => m.Status, statusLikeEntityStatus, "Id", "Status").Title(Resources.General.Status);

          columns.Command(commandConf =>
          
              commandConf.Edit();
              commandConf.Destroy();
          );
      )

希望对你有帮助。

【讨论】:

以上是关于如何在网格行中显示枚举描述或名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何在顺风中以自定义高度居中网格行中的元素?

无法在 Kendo 网格上显示枚举值

如何定位动态条目网格行中的第一项和最后一项?

如何在 2 行中显示过滤器工具栏?

在 ag 网格下拉列表中,如何在选择后显示名称并在保存集值而不是名称上显示。?

Xamarin:如何删除网格中特定行中的项目