【问题标题】:Adding new row to grid将新行添加到网格
【发布时间】:2016-08-09 14:56:05
【问题描述】:

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

然而,

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

到目前为止(来自 Telerik 的一些反馈)我想出了以下...

为数组中的每个Lot 设置一个 Lot Schema 即所有数据的占位符:

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

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

未捕获的类型错误:无法读取未定义的属性“结果”

我了解为什么我收到此错误,因为新项目是使用未定义的LotResults 创建的。我无法理解的是,在 Lot Schema 中设置默认值时会发生这种情况。

感谢您的任何建议,我希望有人曾经出于同样的目的使用过 Kendo Grids,因为我真的很想看看一个可行的示例!

【问题讨论】:

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


    【解决方案1】:

    我认为问题出在 LotResultsSchema。与其将其创建为单独的数组,不如尝试将其合并到字段类中?

    <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

    【讨论】:

    • 感谢您的回复。我已经研究过这种方法(它确实按预期工作)但是属性以这样一种方式保存,当保存到数据库时需要更多的工作。 IE。我希望将计数、平均值和 SD 字段组合在一起,并与它们关联的 LotID/Number 组合在一起。您知道如何实现这一目标吗?
    • 根据我的个人经验,我还没有看到绑定到复杂类型的字段。它通常支持数字、字符串、日期等类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多