javascript - 向网格添加新行

标签 javascript jquery asp.net-mvc kendo-grid

我需要一个Kendo Grid供用户输入“n”个结果,然后单击一个按钮(与网格控件分开),该按钮将把所有结果添加到网格中并保存将它们存入数据库。考虑到网格本身没有进行 CRUD 操作,除了添加额外的空白行用于数据输入之外,这应该是一个简单的任务...

但是,

问题是网格的内容不是静态的,并且可以根据用户输入改变列大小(从 1 到 6)(我的示例展示了如何以数组的形式表示它Lots )。似乎大多数(如果不是全部)可用的教程似乎都只关注静态内容,而对其他内容几乎没有帮助。

到目前为止(根据 Telerik 的一些反馈)我提出了以下方案...

设置批处理架构,即数组中每个批处理的所有数据的占位符:

var Lots = [];
    Lots.push({ ID: 13, LotNumber: "158UL" }),
    Lots.push({ ID: 14, LotNumber: "646UE" });

var LotResultsSchema = [];
    for (var p = 0; p < Lots.length; ++p) {
        LotResultsSchema.push({
            Result: {
                Count: '', 
                Mean: '',  
                SD: ''     
            }
        });
    }  

设置整体网格Schema模型ID:

var schemaModel = kendo.data.Model.define({
        id: "ID",
        fields: {
            ID: { editable: false, nullable: true },
            ResultDateTime: {
                type: "date", validation: {
                    required: true
                }
            },
            LotResults: LotResultsSchema,           
            StandardComment: {
                ID: {
                    nullable: true, validation: {
                        required: false
                    }
                },
                Description: {
                    defaultValue: "<empty>",
                    validation: {
                        required: false
                    }
                }
            },
            ReviewComment: {
                ID: {
                    nullable: true, validation: {
                        required: false
                    }
                },
                Description: {
                    defaultValue: "<empty>",
                    validation: {
                        required: false
                    }
                }
            }
        }
    });

根据上面的架构设置网格的数据源:

var gridConfigDataSourceAdd = new kendo.data.DataSource({
        data: [],           
        schema: {
            model: schemaModel
        }
    });

设置列架构(再次考虑到可以根据数组大小创建多个列):

var columnSchema = [];
columnSchemaAdd.push({ field: "ResultDateTime", format: "{0:yyyy/MM/dd hh:mm:ss}", editor: dateTimeEditor, title: 'Date Time' });
    for (var j = 0; j < Lots.length; ++j) {
        columnSchemaAdd.push({
            title: Lots[j].LotNumber,
            field: Lots[j].ID,
            columns: [{
                field: "LotResults[" + j + "].Result.Count",
                title: 'Count'
            }, {
                field: "LotResults[" + j + "].Result.Mean",
                title: 'Mean'
            }, {
                field: "LotResults[" + j + "].Result.SD",
                title: 'SD'
            }]
        });
    }
    columnSchemaAdd.push({ field: "StandardComment", title: 'Comment', editor: standardCommentDropDownEditor, template: "#=StandardComment.Description#" });
    columnSchemaAdd.push({ field: "ReviewComment", title: 'Review Comment', editor: reviewCommentDropDownEditor, template: "#=ReviewComment.Description#" });
    columnSchemaAdd.push({ command: ["edit", "destroy"] });

设置整体网格:

$("#configAddGrid").kendoGrid({
        dataSource: gridConfigDataSourceAdd,
        height: 550,
        navigatable: true,
        autoBind: false,
        editable: {
            mode: "inline"
        },
        toolbar: ["create"],
        columns: columnSchemaAdd
    });

运行此代码并单击“添加新”按钮来创建新行会产生以下错误:

Uncaught TypeError: Cannot read property 'Result' of undefined

我明白为什么我会收到此错误,因为新项目是使用未定义的LotResults创建的。我无法理解的是,当在批处理模式中设置默认值时,这是如何发生的。

任何建议都是值得赞赏的,我希望有人以前使用过 Kendo Grids 来达到同样的目的,因为我真的很想看看一个有效的例子!

最佳答案

我认为问题出在 LotResultsSchema 上。可以尝试将其合并到 fields 类中,而不是将其创建为单独的数组吗?

<script>
var Lots = [];
    Lots.push({ ID: 13, LotNumber: "158UL" }),
    Lots.push({ ID: 14, LotNumber: "646UE" });


  var fields1 =  {
            ID: { editable: false, nullable: true },
            ResultDateTime: {
                type: "date", validation: {
                    required: true
                }
            },          
            StandardComment: {
                ID: {
                    nullable: true, validation: {
                        required: false
                    }
                },
                Description: {
                    defaultValue: "<empty>",
                    validation: {
                        required: false
                    }
                }
            },
            ReviewComment: {
                ID: {
                    nullable: true, validation: {
                        required: false
                    }
                },
                Description: {
                    defaultValue: "<empty>",
                    validation: {
                        required: false
                    }
                }
            }
  };
    for (var p = 0; p < Lots.length; ++p) {
            fields1['Count' + Lots[p].ID] = {type : "number"};
            fields1['Mean'+Lots[p].ID] = {type : "number"};
            fields1['SD' +Lots[p].ID] = {type : "number"};        
    }
  var schemaModel = kendo.data.Model.define({
        id: "ID",
        fields: fields1
    });

  var gridConfigDataSourceAdd = new kendo.data.DataSource({
        data: [],           
        schema: {
            model: schemaModel
        }
    });

  var columnSchemaAdd = [];
columnSchemaAdd.push({ field: "ResultDateTime", format: "{0:yyyy/MM/dd hh:mm:ss}",  title: 'Date Time' });
    for (var j = 0; j < Lots.length; ++j) {
        columnSchemaAdd.push({
            title: Lots[j].LotNumber,
            field: Lots[j].ID,
            columns: [{
                field: 'Count' + Lots[j].ID ,
                title: 'Count'
            }, 
            {
                field: 'Mean'+Lots[j].ID ,
                title: 'Mean'
            }, {
                field: 'SD' + Lots[j].ID ,
               title: 'SD'
            }]
        });
    }
    columnSchemaAdd.push({ field: "StandardComment", title: 'Comment',  template: "#=StandardComment.Description#" });
    columnSchemaAdd.push({ field: "ReviewComment", title: 'Review Comment',  template: "#=ReviewComment.Description#" });
    columnSchemaAdd.push({ command: ["edit", "destroy"] });
  $("#configAddGrid").kendoGrid({
        dataSource: gridConfigDataSourceAdd,
        height: 550,
        navigatable: true,
        autoBind: false,
        editable: {
            mode: "inline"
        },
        toolbar: ["create"],
        columns: columnSchemaAdd
    });

  </script>

样本http://dojo.telerik.com/uHucA

关于javascript - 向网格添加新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38854166/

相关文章:

javascript - 有没有办法可以淡入 InfoWindow 的自定义内容?

asp.net-mvc - 如何将枚举传递给Html.RadioButtonFor以获取MVC 2 RC 2,C#中的单选按钮列表

c# - 如何调试 mvc4 razor View ?

javascript - 如何使用另一个流临时 "block"bacon.js 中的 EventStream?

javascript - 没有内联脚本,仍然得到 "Refused due to Content Security Policy directive: "script-src 'self' "

javascript - 解析查询有效,但结果显示为未定义或未找到

c# - 为什么我的 View 不显示 ViewBag 的值?

javascript - 当父组件和子组件都是函数组件时,如何将函数作为 Prop 传递?

javascript - 动态绑定(bind) onclick 事件为 for 循环中的所有按钮提供相同的值

c# - 在 jQuery 模态窗口中显示来自代码隐藏的数据