Plugin - Kendo UI - Grid

Razer

基础功能(获取本地数据)

后台

public ActionResult Index()
{
    return View(db.Users);
}

前端

@model IEnumerable<DEMO.Models.User>

@(Html.Kendo().Grid(Model)
    .Name("Grid")
    .Columns(columns =>
            {
                columns.Bound(c => c.UserName);
                columns.Bound(c => c.PassWord);
            })
    )

 

基础功能(从远程服务器获取数据)

后台

public ActionResult GetData([DataSourceRequest] DataSourceRequest request)
{
  return Json(db.Users.ToDataSourceResult(request));
}

前端

@(Html.Kendo().Grid<DEMO.Models.User>()
        .Name("Grid2")
        .Columns(columns =>
            {
                columns.Bound(c => c.UserName);
                columns.Bound(c => c.PassWord);
            })
        .DataSource(dataSource => dataSource
            .Ajax()
            .PageSize(20)
            .Read(read => read.Action("GetData", "Grid"))
        )
    )

 

进阶功能

后台

DEMOContext db = new DEMOContext();

        ///////////////////////////
        ///         视图        ///
        ///////////////////////////
        public ActionResult Index()
        {
            ViewData["teachers"] = (System.Collections.IEnumerable)db.Teachers;
            return View(db.Users);
        }

        ///////////////////////////
        ///       获取数据      ///
        ///////////////////////////
        public ActionResult GetData([DataSourceRequest] DataSourceRequest request)
        {
            return Json(db.Users.ToDataSourceResult(request));
        }

        ///////////////////////////
        ///       增删改查      ///
        ///////////////////////////
        public ActionResult Create(User User)
        {
            if (User != null)
            {
                db.Users.Add(User);
                db.SaveChanges();
            }

            return RedirectToAction("Index", "Grid");
        }
        public ActionResult Delete(User User)
        {
            if (User != null)
            {
                db.Entry(User).State = System.Data.Entity.EntityState.Deleted;
                db.SaveChanges();
            }

            return RedirectToAction("Index", "Grid");
        }
        /// <summary>
        /// 更新
        /// 只能在 Batch=true 下才能获得集合数据
        /// </summary>
        public ActionResult Update([Bind(Prefix = "models")] IEnumerable<User> Users)
        {
            if (Users != null && ModelState.IsValid)
            {
                foreach (var user in Users)
                {
                    db.Entry(user).State = System.Data.Entity.EntityState.Modified;
                }

                db.SaveChanges();
            }

            return RedirectToAction("Index","Grid");
        }
        /// <summary>
        /// 更新
        /// 在 Batch=true, Batch=false下都可以使用
        /// Batch=true  将集合对象多次发送给该方法
        /// Batch=false 则发送单个对象
        /// <summary>
        public ActionResult Update2(User User)
        {
            if (User != null && ModelState.IsValid)
            {
                db.Entry(User).State = System.Data.Entity.EntityState.Modified;

                db.SaveChanges();
            }

            return RedirectToAction("Index", "Grid");
        }

前端 

// <DEMO.Models.User> 为指定获取远程数据的类型
// Model 则为本地数据
@(Html.Kendo().Grid<DEMO.Models.User>(Model)
        .Name("Grid")
        .Columns        // 列选项
        (       
            columns =>
            {
                // 绑定数据1
                columns.Bound(c => c.UserName);
                // 绑定数据2
                columns.Bound(c => c.PassWord);
                // 绑定外键数据
                // Inline 编辑模式下会出现下拉框, Popup模式下则没有
                // ViewData需要是一个IEnumerable数据
                // 或者可以是SelectList数据
                columns.ForeignKey(c => c.TreacherID, (System.Collections.IEnumerable)ViewData["teachers"], "ID", "Name");
                // 列模板,只有在绑定出错的情况下Template才会有效
                // 绑定正确的情况下只对ClientTemplate有效,我也不知道这是什么傻逼设定
                columns.Template(@<div>button</div>).ClientTemplate("<button>button2</button>")
                // 命令按钮
                columns.Command
                    (
                        command =>
                        {
                            // 选择, 在服务器模式下使用
                            command.Select();
                            // 编辑, 在Batch模式下必须使用 InCell模式
                            command.Edit();
                            //删除
                            command.Destroy();
                        }
                    );
            }
        )
        .ToolBar        // 是否支持工具栏
        (
            toolbar =>
            {
                // 添加按钮
                toolbar.Create();
                // 保存&取消按钮 在Batch模式下使用,必须使用InCell的编辑模式
                toolbar.Save();
                // 导出Excel
                // 不能再 Server 模式下使用
                toolbar.Excel();
                // 导出到Pdf
                toolbar.Pdf();
                // 自定义按钮
                toolbar.Custom();
            }
        )
        .Pageable       // 是否支持分页
        (
            pageable =>
                {
                    // 是否有刷新按钮
                    // 使用远程获取数据的情况下才可以使用
                    pageable.Refresh(true);
                    // 是否有选项选择一页显示多少数据,
                    // 重载.PageSizes(int[]) 表示给出几种选择
                    pageable.PageSizes(true);
                    // 显示可选择的页码数
                    pageable.ButtonCount(5);
                }
        )
        .Editable       // 是否支持编辑
        (
            editable => 
                {
                    // 编辑模式
                    // InCell 单元格中
                    // InLine 行
                    // PopUp 新窗口
                    editable.Mode(GridEditMode.InLine);
                }
        )
        .Selectable     // 是否支持选择
            (
                selectable => 
                    {
                        // 支持多选还是单选
                        selectable.Mode(GridSelectionMode.Multiple);
                        // 已行为单位还是单元格为单位
                        selectable.Type(GridSelectionType.Row);
                    }
            )
        .Sortable()     // 是否支持排序
        .Scrollable     // 固定表格高度 并在数据长度超出时给出滚动条
        (
            scr => 
                {
                    // 高度
                    scr.Height(200);
                    // 支持虚拟化读取数据
                    // 每次获取固定条数据,当滚动条滚动的时候重新读取新的数据
                    scr.Virtual(true);
                }
        )
        .Filterable()   // 是否支持筛选
        .Groupable()    // 是否支持分组
        .Navigatable()  // ?
        .DataSource     // 数据绑定选项
        (
            dataSource => dataSource
                    // 服务器模式, 每次操作都会请求服务器
                // .Server()
                    // 是否异步
                .Ajax()
                    // 是否批量发送数据
                    // 如果是 则批量更改数据后 向后台发送 IEnumerable<Type> 数据
                    // 如果否 则分批向后台传送 Type 数据
                    // 无法再服务器模式下使用
                .Batch(false)
                    // 默认一页显示多少条记录
                .PageSize(8)
                    // 在服务端操作, 需要在后台的方法中加 [DataSourceRequest]DataSourceRequest request 参数
              //  例如在分页的情况下, 每点击下一页都会访问一次服务器. 否则是一次性读取所有的数据到前端 由前端分页
                    // 无法再服务器模式下使用
                .ServerOperation(false)
                    //
                .Model
                (
                    model =>
                    {
                        // 指定主键, 
              // 在只用自带的编辑模式的时候, 依靠主键来确定每条记录的唯一性, 否则会产生意想不到的结果
              model.Id(p => p.ID);
                        // 插入新数据时默认值, 批量数据会产生一次
                        model.Field(p => p.TreacherID).DefaultValue(2);
                    }
                )
                    // 添加的数据发送的控制器
                .Create("Create", "Grid", new { parameter = 1 })
                    // 编辑的数据发送的控制器
                .Update("Update2", "Grid", new { parameter = 1 })
                    // 删除的数据发送的控制器
                .Destroy("Delete", "Grid", new { parameter = 1 })
                    // 绑定数据的事件
                .Events(events => 
                {
                    // 每次 Grid 单元格发生变化就触发
                    // 包括在编辑过程中没有保存的改变
                    e.Change("change1");
                    // 更新数据之后接受了服务端的响应之后触发
                    e.Sync("sy");
                    // 错误事件
                    e.Error("error_handler");
                })
                    // 从控制器中读取数据
                .Read(read => read.Action("GetData", "Grid"))
        )
        .Events(e =>
        {
            // 选择表格的行或者单元格时触发
            e.Change("change2");
            // 点击取消保存按钮时 (inline 或 popup 编辑模式下) 触发
            // 或者关闭 Popup 窗口时触发
            e.Cancel("cancel1");
            // 点击了 Edit 按钮 打开一个编辑框时触发
            e.Edit("edit1");
            // 移除一条记录的时候触发
            e.Remove("Remove");
            // 点击了 Custom 中的 Save 按钮触发的事件
            // 在实际数据传送到 Controller 之前??
            e.SaveChanges("saveChange1");
            // 点击了 Edit 中的 Update 按钮触发的事件
            // 在实际数据传送到 Controller 之前
            e.Save("save1");
            // 每次发生数据绑定都会触发
            e.DataBound("bound1");
        }
)

 

 

 

HTML

基础功能

后台

///////////////////////////
///       获取数据      ///
///////////////////////////
public ActionResult GetData()
{
    return Json(db.Users);
}

前台

<div id="grid"></div>

  脚本

<script>
    $(function ()
    {
        $("#grid").kendoGrid
        (
            {
                dataSource: // 数据源设置
                {
                    transport:
                    {
                        // 读取设置
                        read:
                        {
                            url: "/Grid/GetData",
                            dataType: "json",
                            type: "POST"
                        },
                    }
                },
                columns:    // 行设置
                [
                    {
                        field: "UserName",
                        title: "用户名",
                    },
                    {
                        field: "PassWord",
                        title: "密码"
                    }
                ]
            }
        );
    });
</script>

 

方法函数

// 重新读取数据, 该操作会引发一次 read
$("#grid").data("kendoGrid").dataSource.read();
// 刷新数据, 针对前端grid已经更新掉的数据(针对已经更新完毕的), 不会引发一次read
$("#grid").data("kendoGrid").refresh();

 

 

使用方法:

1. 利用数据自定义某单元格

.Columns
    (
        c=>
        {
            c.Bound(d => d.ID);
            c.Bound(d => d.Name);
            c.Template(d => d.Sex).ClientTemplate
                (
                    "# if(Sex){ #" +
                        "<span style='color:red'>" +
                            "" +
                        "</span>" +
                    "# }" +
                    "else { #" +
                        "2" +
                    "# } #"
                );
        }
    )

 

2. 自定义行

    .ClientRowTemplate(
            "# if(Sex){ #" +
                "<tr data-uid='#: uid #' class='tr_boy'>" +
            "# }" +
            "else { #" +
                "<tr data-uid='#: uid #' class='tr_girl'>" +
            "# } #" +
                "<td>" +
                        "#: Name # " +
                    "</td>" +
                    "<td>" +
                        "#: Sex #" +
                    "</td>" +
                "</tr>"
    )

 

 

$(function () {
    var detailgrid = $("#grid");
    
    /*
    * 为行添加双击事件
    */
    detailgrid.on('dblclick', 'tr', function (e) {
        // 获取当前选择行数据  
        // 需要 grid 开启 select 支持的情况下
        var row = detailgrid.data("kendoGrid").select();
        var dataItem = detailgrid.data("kendoGrid").dataItem(row);

        // grid 的 editRow 方法
        // 将当前行对象当做参数传入
        detailgrid.data("kendoGrid").editRow($(this));
    });
});

 

posted @ 2015-05-06 10:38  `Laimic  阅读(1034)  评论(2)    收藏  举报