【问题标题】:Issue on adding Multi level Nested Grid View in ASP.NET MVC在 ASP.NET MVC 中添加多级嵌套网格视图的问题
【发布时间】:2017-04-13 00:30:00
【问题描述】:

我在 http://www.c-sharpcorner.com/uploadfile/rahul4_saxena/asp-net-mvc4-showing-data-in-nested-grid-view-using-jquery/ 之后的项目中使用了嵌套网格视图。直到第 2 级它运行良好,但问题是当我添加另一个级别时它给了我一个错误“必须先绑定数据源才能执行此操作。”请帮助我,谢谢

模型视图

public class PackagesVM
{
    public Packages packages { get; set; }
    public List<Lot> lots { get; set; }

}

地块模型

[Table("Lots")]
public partial class Lot
{
    public int id { set; get; }
    public string lot_number { set; get; }
    public decimal? contracted_amount { set; get; }
    public int? pack_id {set;get;}
    public DateTime? created_at { set; get; }
    public List<Projects> projects { get; set; }


}

控制器

// GET: /Project/  
    public ActionResult GetPackagesLot()
    {

        List<PackagesVM> PackagesLotsProjectsVM = new List<PackagesVM>();

        using (db)
        {
            var packs = db.Packages1.OrderBy(a => a.id).ToList();
            foreach (var pack in packs)
            {

                var lo = db.Lots.Where(a => a.pack_id == pack.id).ToList();

                foreach (var lot in lo)
                {
                    var proj = db.Projects1.Where(p => p.lot_id == lot.id).ToList();
                    // PackagesLotsProjectsVM.Add(new PackagesVM { projects = proj });

                }

                PackagesLotsProjectsVM.Add(new PackagesVM { packages = pack, lots = lo});
            }
        }

查看

@model IEnumerable<CMIS.Models.PackagesVM>
<div id="main" style="padding: 25px; background-color: white;">
                        @grid.GetHtml(
                        htmlAttributes: new { id = "gridT", width = "100%" },
                        columns: grid.Columns(
                                //grid.Column("Id", "Pack ID"),
                                //grid.Column("Name", "Package Name"),
                                         grid.Column("packages.id", "Id"),
                                         grid.Column("packages.name", "Package Name"),
                                         grid.Column("packages.province_id", "ProvinceID"),
                                         grid.Column(header: "Created_at", format: (item) => string.Format("{0:dd-MM-yyyy}", item.packages.created_at)),

                                grid.Column(format: (item) =>
                                {
                                    WebGrid subGrid1 = new WebGrid(source: item.Lots);
                                    return subGrid1.GetHtml(
                                        htmlAttributes: new { id = "subT1", width = "100%" },
                                        columns: subGrid1.Columns(
                                                subGrid1.Column("ID", "Id"),
                                                subGrid1.Column("contracted_amount", "contracted_amount"),
                                                //subGrid1.Column("id", "id"),
                                                //subGrid1.Column("lot_number", "lot_number"),
                                                //subGrid1.Column("contracted_amount", "contracted_amount"),
                                                //subGrid1.Column("pack_id", "pack_id"),
                                                //subGrid1.Column("created_at", "created_at"),


                                                subGrid1.Column(format: (subitem) =>
                                                {
                                                    WebGrid subGrid2 = new WebGrid(source: subitem.projects);
                                                    return subGrid2.GetHtml(
                                                    htmlAttributes: new { id = "subT2" },
                                                    columns: subGrid2.Columns(
                                                        subGrid2.Column("id", "Id"),
                                                        subGrid2.Column("db_number", "db_number")

                                                    )
                                                  );

                                                })
                                            )
                                        );
                                })
                            )
                        )
                    </div>

脚本

<script>
   $(document).ready(function () {
       var size = $("#main #gridT > thead > tr >th").size(); // get total column
       $("#main #gridT > thead > tr >th").last().remove(); // remove last column
       $("#main #gridT > thead > tr").prepend("<th></th>"); // add one column at first for collapsible column
       $("#main #gridT > tbody > tr").each(function (i, el) {
           $(this).prepend(
                   $("<td></td>")
                  .addClass("cc")
                   .addClass("hoverEff")
                   .attr('title', "click for show/hide")
               );

           //Now get sub table from last column and add this to the next new added row
           var table = $("table", this).parent().html();
           //add new row with this subtable
           $(this).after("<tr><td></td><td style='padding:5px; margin:0px;' colspan='" + (size - 1) + "'>" + table + "</td></tr>");
           $("table", this).parent().remove();
           // ADD CLICK EVENT FOR MAKE COLLAPSIBLE
           $(".hoverEff", this).on("click", function () {
               $(this).parent().closest("tr").next().slideToggle(100);
               $(this).toggleClass("dd cc");
           });
       });

       //by default make all subgrid in collapse mode
       $("#main #gridT > tbody > tr td.cc").each(function (i, el) {
           $(this).toggleClass("dd cc");
           $(this).parent().closest("tr").next().slideToggle(100);
       });


       var size = $("#main #subT1 > thead > tr >th").size(); // get total column
       $("#main #subT1 > thead > tr >th").last().remove(); // remove last column
       $("#main #subT1 > thead > tr").prepend("<th></th>"); // add one column at first for collapsible column
       $("#main #subT1 > tbody > tr").each(function (i, el) {
           $(this).prepend(
                   $("<td></td>")
                  .addClass("cc")
                  // .addClass("ee")
                   .addClass("hoverEff")
                   .attr('title', "click for show/hide")
               );

           //Now get sub table from last column and add this to the next new added row
           var table = $("table", this).parent().html();
           //add new row with this subtable
           $(this).after("<tr><td></td><td style='padding:5px; margin:0px;' colspan='" + (size - 1) + "'>" + table + "</td></tr>");
           $("table", this).parent().remove();
           // ADD CLICK EVENT FOR MAKE COLLAPSIBLE
           $(".hoverEff", this).on("click", function () {
               $(this).parent().closest("tr").next().slideToggle(100);
               $(this).toggleClass("ddd cc");
           });
       });

       //by default make all subgrid in collapse mode
       $("#main #subT1 > tbody > tr td.cc").each(function (i, el) {
           $(this).toggleClass("ddd cc");
           $(this).parent().closest("tr").next().slideToggle(100);
       });




   });
</script>

请帮助我。谢谢

【问题讨论】:

标签: c# asp.net-mvc-4 gridview


【解决方案1】:

只需按照以下步骤来实现“在 asp.net MVC 中显示多级嵌套网格数据”。 1.创建自定义HTML Helpers。 右键单击解决方案资源管理器下的 App_Code 文件夹 > 添加 > 新项目 > 选择 MVC5 视图页面 (Rozar) > 输入名称(此处为“NestedData.cshtml”)> 添加。 将以下代码写入 App_Code 文件夹下新创建的视图中。

        @helper GetHtml(List<MVCNestedGrid.Employee> employeeList, int parentID) {
        <table class="table table-bordered">
           @{
               int currentID = 0;
               int rowIndex = 0;
               foreach (var i in employeeList.Where(a=>a.ReportsTo.Equals(parentID)))
               {
                   if (i.EmployeeID == currentID)
                   {
                       continue;
                   }
                   else
                   {
                       if (rowIndex == 0)
                       {
                           <thead>
                               <tr>
                                   <th>Employee ID</th>
                                   <th>Employee Name</th>
                                   <th>Title</th>
                                   <th>Home Phone</th>
                               </tr>
                           </thead>
                       }
                       rowIndex++;
                       currentID = i.EmployeeID;
                       var Sub = employeeList.Where(a => a.ReportsTo.Equals(i.EmployeeID)).ToList();
                       var newEmployeeList = employeeList.Where(a => !a.EmployeeID.Equals(i.EmployeeID)).ToList();
                       <tbody>
                           <tr>
                               <td>
                                   @if (Sub.Count > 0)
                                   {
                                       <span class="icon icon-e" style="float:left; cursor:pointer;"></span> 
                                   }
                                   else
                                   {
                                       <span style="display:inline-block;width:14px">&nbsp;</span>
                                   }
                                   @i.EmployeeID
                               </td>
                               <td>@i.TitleOfCourtesy @i.FirstName @i.LastName</td>
                               <td>@i.Title</td>
                               <td>@i.HomePhone</td>
                           </tr>
                           <tr style="display:none;">
                               @if (Sub.Count > 0)
                               {
                                   <td colspan="4" class="innerTable">
                                       @NestedData.GetHtml(newEmployeeList, i.EmployeeID)
                                   </td>
                               }
                               else
                               {
                                    <td colspan="4">

                                    </td>
                               }
                           </tr>
                       </tbody>
                   }
               }
           }
        </table>

}

  1. 创建一个 MVC 控制器。 转到解决方案资源管理器>右键单击解决方案资源管理器中的控制器文件夹>添加>控制器>输入控制器名称>选择Templete“空MVC控制器”>添加。

    在这里我创建了一个名为“HomeController”的控制器

        public ActionResult Index()
    {
        List<Employee> list = new List<Employee>();
        using (MyDatabaseEntities dc = new MyDatabaseEntities())
        {
            list = dc.Employees.OrderBy(a => a.EmployeeID).ToList();
        }
        return View(list);
    }
    

3.为您的动作和设计添加视图。

@model List<MVCNestedGrid.Employee>
    @{
        ViewBag.Title = "Index";
    }

    <h2>Display multilevel nested grid data in asp.net MVC</h2>
    <div class="container">
        @NestedData.GetHtml(Model,0)
    </div>

    @* CSS *@
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
    <style>
        .container{min-width:500px; overflow:hidden;}
        .innerTable table{margin:0px auto; border-left-width:4px;}
        td.innerTable {padding-left:20px !important;}
        .icon {
            background-image: url('http://demo.dotnetawesome.com/images/ui-icons_222222_256x240.png');
            background-repeat:no-repeat;
            width:16px;
            height:16px;
            display:inline-block;
            float:left;
        }
        .icon-e{background-position:-32px -16px}
        .icon-s{background-position:-64px -16px}
    </style>
    @* Jquery for Collapse/Expend *@
    <script type="text/javascript">
        $(document).ready(function () {
            $('.icon').live('click', function () {
                var $pRow = $(this).parents('tr');
                var $nextRow = $pRow.next('tr');
                $nextRow.toggle();
                $(this).toggleClass('icon-s icon-e');
            });
        })
    </script>

更多web design mvc asp.net 中的代码 http://www.tabnakit.com

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多