2013-10-26 22 views
6

Tôi đang sử dụng lưới Kendo trong ứng dụng ASP.Net MVC của mình. Nếu tôi có định nghĩa lưới sau đây,Làm thế nào để hiển thị mô tả hoặc tên trong một hàng lưới?

@(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() 
) 

trong đó một trong các cột là một Enum. Định nghĩa enum của tôi là:

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

Làm cách nào để hiển thị chữ "My Enum 1" hoặc "My Enum 2" cho mỗi hàng?

Cảm ơn trước!

Trả lời

2

Tôi tạo ra một lớp helper chứa một số phương pháp mở rộng một khi trở lại:

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

Nó chứa hai phương pháp để chiết xuất NameDescription của một thuộc tính Display. Tên hiển thị:

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

Và đối với một mô tả:

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

Bạn cần phải thêm một tuyên bố sử dụng trong Web.config của bạn hoặc theo quan điểm của bạn.

Cập nhật

gì nếu bạn tạo một tài sản cho nó trong mô hình của bạn:

public string MyEnumName 
{ 
    get { return MyEnum.GetDisplayName(); } 
} 

Bây giờ bạn sẽ có thể sử dụng:

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

Tôi đã thử ở trên và gặp lỗi khi chạy ứng dụng.Lỗi là "Các cột bị ràng buộc yêu cầu biểu thức truy cập trường hoặc thuộc tính.". Cảm ơn vì đã phản hồi sớm! –

+0

@wm_ Tôi đã cập nhật câu hỏi của mình. Nó có giúp bạn không? –

+0

Nếu tôi liên kết nó như trên, có nghĩa là tôi không thể sử dụng khả năng lọc của lưới điện? Hiện tại, kể từ khi nó được ràng buộc với một Enum thực tế, tôi nhận được một hộp kết hợp có chứa tất cả các giá trị enum khác nhau để chọn từ trong trình đơn bộ lọc. –

6

Gần đây tôi đã chạy vào này vấn đề và giải quyết nó bằng cách sử dụng

var someArrayOfValueAndText = new[] {new { 
    Id = 0, Description = "Foo" 
}, new { 
    Id = 1, Description = "Bar" 
} 
.Columns(c.ForeignKey(m=> m.MyEnum, someArrayOfValueAndText, "Id","Description")) 

thay vì phương pháp .Bound

+0

Bạn đặt khai báo mảng ở đâu? – callisto

2

Giải pháp của Henk là tốt. Nhưng bạn có thể sử dụng khả năng lọc nếu bạn sử dụng ClientTemplate:

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

Để biết thêm thông tin về kendo mẫu ui xem: http://docs.telerik.com/kendo-ui/framework/templates/overview

+0

Hoàn hảo. Đã làm cho tôi. – Mahmoodvcs

2

tôi sử dụng @ user1967246 phương pháp và muốn giải thích thêm làm thế nào để tôi làm.

i tạo mảng trong top lưới kendo tôi

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

Sau đó, tôi sử dụng tài sản thay vì ràng buộc ForeignKey.

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

Đây là thuộc tính cột của tôi

.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(); 
      }); 
     }) 

Hy vọng nó sẽ giúp cho bạn.

Các vấn đề liên quan