【问题标题】:ASP NET MVC kendo grid and column nameASP NET MVC 剑道网格和列名
【发布时间】:2014-02-19 20:40:03
【问题描述】:

我有带有字段的 sql 表: ID、字段 1、字段 2、字段 3、字段 4、字段 5 我还有其他带有列的表 f1,f2,f3,f4,f5 此表只有一行包含以下数据: 代码、供应商、型号、年份、价格

我的项目中有这个模型

public class Products
{
  [ScafoldColumn(false)]  
  public Guid Id{get;set;}
  public string Field1{get;set;}
  public string Field2{get;set;}
  public string Field3{get;set;}
  public string Field4{get;set;}
  public string Field5{get;set;}
}

而且我希望我的剑道网格显示列标题不像 Field1... 但与表 2 中的数据类似(代码、供应商、型号、年份、价格) 如何从表中加载这些数据并设置为剑道网格列标题?

【问题讨论】:

    标签: asp.net-mvc kendo-ui kendo-grid


    【解决方案1】:

    我不确定您的要求是否可以完成。但是 Kendo Grid 有一个 title 属性,所以你可以随意设置 Header。

    @(Html.Kendo().Grid<OMSWeb.Models.OrderGridViewModel>()
     .Name("grid")
    .HtmlAttributes(new { style = "width:115%;font-size:10px;line-height:2em" })
    .Columns(columns =>
    {        
        columns.Bound(m => m.AdvertiserName).Title("Advertiser Name");
    });
    
    etc.
    

    【讨论】:

    • 谢谢我会尝试这样做columns.Bound(m =&gt; m.AdvertiserName).Title(m =&gt; m.ColumnName); 然后告诉我有什么结果
    • @Std_Net,我认为 lambda 表达式行不通,它只需要一个简单的字符串
    • 这是正确的@CSharper - 您只能在此处为列标题定义一个简单的字符串。
    【解决方案2】:

    你实际上不能做你正在尝试的事情。你可以像下面这样绑定你的模型并使用 Title() 就像 #C Sharper 说的那样:

    @(Html.Kendo().Grid<Models.Products>()
      .Name("YourReportName")
      .Resizable(resizing => resizing.Columns(true))
      .Columns(columns =>
        {
        columns.Bound(p => p.ID).Width(50).Title("ID");
        columns.Bound(p => p.Field1).Width(50).Title("f1");
        columns.Bound(p => p.Field2).Width(50).Title("f2");
        columns.Bound(p => p.Field3).Width(50).Title("f3");
        columns.Bound(p => p.Field4).Width(50).Title("f4");
        columns.Bound(p => p.Field5).Width(50).Title("f5");
        })
      .Scrollable()
      .DataSource(dataSource => dataSource.Ajax()
        .Read(read => read.Action("GetModelData", "Home")))
      .Pageable(pager => pager.Refresh(true))
      .Sortable()
    )
    

    如果你用 js 绑定你的网格并接受 JSon 并且你希望你的列名应该是数据库驱动的,这应该是可以实现的。在后面的代码中,您只需使用 JsonConvert.SerializeObject(Products); 将对象转换为 json 并从 DB 中获取所需的列名,将“Field1”、“Field2”等替换为“f1”、“ f2" 等。希望这会有所帮助。如果您需要进一步的帮助,请发表评论。谢谢。

    【讨论】:

      【解决方案3】:

      感谢您的回答。但我找到了其他解决方案 我创建类

      public class MyMetadataProvider : AssociatedMetadataProvider
      {
          public MyMetadataProvider () : base()
          {
          }
      
          protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType,
                                                          string propertyName)
          {
              var metaData = new ModelMetadata(this, containerType, modelAccessor, modelType, propertyName);
      
              if (propertyName == null)
                  return metaData;
              if (propertyName.StartsWith("Field"))
              {
                  var c = DbHelper.GetProductColumns();//get data from database
                  if (c.Count == 1)
                  {
                      if (c != null && propertyName == "Field1")
                          metaData.DisplayName = c[0].F1;
                      if (c != null && propertyName == "Field2")
                          metaData.DisplayName = c[0].F2;
                      if (c != null && propertyName == "Field3")
                          metaData.DisplayName = c[0].F3;
                      if (c != null && propertyName == "Field4")
                          metaData.DisplayName = c[0].F4;
                      if (c != null && propertyName == "Field5")
                          metaData.DisplayName = c[0].F5;
                  }
              }
              else
              {
                  if (attributes != null)
                  {
                      foreach (var a in attributes)
                      {
                          var type = a.TypeId as Type;
                          if (type != null && type.Name == "DisplayNameAttribute")
                          {
                              var dn = (a as DisplayNameAttribute).DisplayName;
                              if (!string.IsNullOrEmpty(dn))
                                  metaData.DisplayName = dn;
      
                          }
                      }
                  }
              }
              return metaData;
          }
      
      
      }
      

      使用这个元数据提供程序,我可以更改我网站中的任何网格,而无需任何额外的 JS 代码。我希望这对其他人有帮助。 再次感谢。

      【讨论】:

      • 在哪里包含这个类?
      • 进入文件 Global.asax.cs 添加到protected void Application_Start(){... ModelMetadataProviders.Current = new BarcodeMetadataProvider();}
      【解决方案4】:

      如果可用,请使用您的模型。像这样

      @Html.Kendo().Grid(Model.Records).Name("ProfessionalScheduleGrid").Columns(x=>
          {
              x.Bound(item => item.Staff.User.Email).Title("Email");
              x.Bound(item => item.Discipline.Name).Title("Discipline");
              x.Bound(item => item.Day1Activity.Activity.Code).Title(Model.SelectedSchedule.ScheduleDays.OrderBy(y => y.DayNumber).Where(y => y.DayNumber == 1).First().Day.ToString("ddd(dd)"));
              x.Bound(item => item.Day2Activity.Activity.Code).Title(Model.SelectedSchedule.ScheduleDays.OrderBy(y => y.DayNumber).Where(y => y.DayNumber == 2).First().Day.ToString("ddd(dd)"));
              x.Bound(item => item.Day3Activity.Activity.Code).Title(Model.SelectedSchedule.ScheduleDays.OrderBy(y => y.DayNumber).Where(y => y.DayNumber == 3).First().Day.ToString("ddd(dd)"));
              x.Bound(item => item.Day4Activity.Activity.Code).Title(Model.SelectedSchedule.ScheduleDays.OrderBy(y => y.DayNumber).Where(y => y.DayNumber == 4).First().Day.ToString("ddd(dd)"));
              x.Bound(item => item.Day5Activity.Activity.Code).Title(Model.SelectedSchedule.ScheduleDays.OrderBy(y => y.DayNumber).Where(y => y.DayNumber == 5).First().Day.ToString("ddd(dd)"));
              x.Bound(item => item.EntireWeekActivity).Title("Set Entire Week");
      }).Sortable().Filterable().Pageable().Selectable().DataSource(dataSource => dataSource.Server().Model(model => model.Id(p => p.Id)))
      

      【讨论】:

        【解决方案5】:

        嘿,我在通过 Jquery 生成的剑道网格中做了同样的事情。

        第 1 步: 从第二个表的数据(代码、供应商、型号、年份、价格)创建一个数组。

        第 2 步: 构建一个 ColumnList,使其对象的“字段”属性指向您的表 1,并且“标题”将从我们创建的数组元素中获取。

        第 3 步: 将此 columnList 分配给您的 kendo columns 属性。

        唯一需要注意的是两个表中的列数应该相等。

        【讨论】:

          【解决方案6】:

          正如这篇文章中的回答...http://www.somedave.com/posts/automatically-generating-column-titles-for-a-kendoui-mvc-grid

          使用方法:

          columns.Bound(p => p.YourField).DisplayNameTitle();
          

          添加代码:

          public static GridBoundColumnBuilder<TModel> DisplayNameTitle<TModel>(
          this GridBoundColumnBuilder<TModel> builder) where TModel : class, new()
          {
              // Create an adapter to access the typed grid column
              // (which contains the Expression)
          Type adapterType = typeof(GridBoundColumnAdapter<,>)
              .MakeGenericType(typeof(TModel), builder.Column.MemberType);
          IGridBoundColumnAdapter adapter =
              (IGridBoundColumnAdapter)Activator.CreateInstance(adapterType);
          
          // Use the adapter to get the title and set it
          return builder.Title(adapter.GetDisplayName(builder.Column));
          }
          
          private interface IGridBoundColumnAdapter
          {
              string GetDisplayName(IGridBoundColumn column);
          }
          
          private class GridBoundColumnAdapter<TModel, TValue>
          : IGridBoundColumnAdapter where TModel : class, new()
          {
              public string GetDisplayName(IGridBoundColumn column)
              {
              // Get the typed bound column
              GridBoundColumn<TModel, TValue> boundColumn =
                  column as GridBoundColumn<TModel, TValue>;
              if (boundColumn == null) return String.Empty;
          
              // Create the appropriate HtmlHelper and use it to get the display name
              HtmlHelper<TModel> helper = HtmlHelpers.For<TModel>(
                  boundColumn.Grid.ViewContext,
                  boundColumn.Grid.ViewData,
                  new RouteCollection());
              return helper.DisplayNameFor(boundColumn.Expression).ToString();
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多