0

アプリケーションに剣道グリッドがあります。 ここに画像の説明を入力

@(Html.Kendo().Grid<TekstenViewModel.Tekst>()
    .Name("Grid")
    .Columns(columns =>
    {
        columns.Template(@<text></text>).ClientTemplate("<input type='checkbox'/>").Width(10).Hidden(!Model.Administrator);

        columns.Bound(product => product.ResourceSetNaam).ClientTemplate("#= ResourceSetNaam#").Title("Groep");

        columns.Bound(product => product.Naam).ClientTemplate("#= Naam#");

        columns.Bound(product => product.Waarde).ClientTemplate("<div id='editorDiv'><div class='input'>#if(Waarde){# #if(Waarde.length>100){# # var myContent =Waarde; #  # var dcontent = myContent.substring(0,100); # <span>#=kendo.toString(dcontent)#</span> #}else{# <span>#=Waarde#</span> #}# #}#</div><div class='editor'>" +
            Html.WebCore().LinkButton(type: ButtonType.Edit, htmlAttributes: new { onclick = "onOpenEditorPopup('#: Waarde #', '#: Id #', 'Waarde')" })).Title("Tekst (Nederlands)");

        columns.Bound(product => product.Opmerking).ClientTemplate("<div id='editorDiv'><div class='input'>#if(Opmerking){# #if(Opmerking.length>100){# # var myContent =Opmerking; #  # var dcontent = myContent.substring(0,100); # <span>#=kendo.toString(dcontent)#</span> #}else{# <span>#=Opmerking#</span> #}# #}#</div><div class='editor'>" +
            Html.WebCore().LinkButton(type: ButtonType.Edit, htmlAttributes: new { onclick = "onOpenEditorPopup('#: Opmerking #', '#: Id #', 'Opmerking')" })).Title("Omschrijving");

        columns.Template(@<text></text>).ClientTemplate("<div id='deleteDiv'><div class='delete'><a class=\"delete iconBtn\" onclick=\"deleteResourceItem(#: Id #, '#: Naam #')\"></a></div></div>").Width(10).Hidden(!Model.Administrator);
    })
    .Pageable()
    .Sortable()
    .Filterable()
    .Events(events => events.Edit("onCellEdit").DataBinding("onDataBinding"))
    .Groupable()
    .Resizable(a => a.Columns(true))
    .Navigatable()
    .Editable(editable => editable.Mode(GridEditMode.InCell).DisplayDeleteConfirmation(false).CreateAt(GridInsertRowPosition.Bottom))
    .DataSource(dataSource => dataSource
        .Ajax()
        .Batch(true)
        .Events(e => e.Error("onErrorhandling"))
        .Model(model =>
        {
            model.Id(product => product.Id);
            model.Field(product => product.Naam).Editable(Model.Administrator);
            model.Field(product => product.Opmerking).Editable(Model.Administrator);
            model.Field(product => product.Waarde).Editable(!Model.ReadOnly);
            model.Field(product => product.ResourceSetId).DefaultValue(Model.SetId);
            model.Field(product => product.Type).DefaultValue(Domain.Agromilieu2.Common.Objects.Entities.Resources.ResourceType.GLOBAL_RESOURCES);
            model.Field(product => product.Taal).DefaultValue(Domain.Agromilieu2.Common.Agromilieu2Constants.Resources.DEFAULT_TAAL_CODE);
        })
        .Create(create => create.Action(MVC.BeheerTeksten.ActionNames.CreateResourceItems, MVC.BeheerTeksten.Name).Data("onCreateAdditionalData"))
        .Read(read => read.Action(MVC.BeheerTeksten.ActionNames.ReadResourceItems, MVC.BeheerTeksten.Name, new { setId = Model.SetId }).Data("onReadAdditionalData"))
        .Update(update => update.Action(MVC.BeheerTeksten.ActionNames.UpdateResourceItems, MVC.BeheerTeksten.Name).Data("onUpdateAdditionalData"))
        .Destroy(destroy => destroy.Action(MVC.BeheerTeksten.ActionNames.DeleteResourceItems, MVC.BeheerTeksten.Name))
        )
)

たとえば、Waarde 列のテキストの横にあるボタンをクリックすると、そのテキストで Kendo Editor が開きます。

ここに画像の説明を入力

[OK] をクリックすると、編集したテキストがグリッドに返されます。

var selectedGridRowId = 0;
var selectedGridColumnName;
function onOpenEditorPopup(gridCellContent, gridIdentifier, columnIdentifier, ReadOnly, Administrator) {
        var editor = $("#waardeEditor").data("kendoEditor")

        if ((ReadOnly == "false" && Administrator == "false" && columnIdentifier != "Waarde") || ReadOnly == "true") {
            editor.body.contentEditable = false;
            $('.k-editor-toolbar').hide();
        }
        else {
            editor.body.contentEditable = true;
            $('.k-editor-toolbar').show();
        }

        editor.value(htmlDecode(gridCellContent));
        domain.WebCore.popup.show("textEditor");

        selectedGridRowId      = gridIdentifier;
        selectedGridColumnName = columnIdentifier;
    };


 domain.WebCore.popup.configure("textEditor")
        .click(function (b) {
            var grid       = $("#Grid").data("kendoGrid");
            var editor     = $("#waardeEditor").data("kendoEditor")
            var parentItem = grid.dataSource.get(selectedGridRowId);

            parentItem.set(selectedGridColumnName, htmlEscape(htmlEncode(editor.value())));
        });

selectedGridRowId と selectedGridColumnName を使用して、編集したテキストを返す場所を確認します。しかし、同僚の 1 人がバグを発見しました。新しいレコードでは機能しません。

誰かが新しいレコードを入力し、テキスト エディターなどを使用して Waarde 列にテキストを入力しようとすると、selectedGridRowId と selectedGridColumnName の両方が null になり、それは明らかです。

次に、明らかな理由から、「Uncaught TypeError: 未定義のプロパティ '値' を読み取ることができません」というメッセージが表示されます。

var parentItem = grid.dataSource.get(selectedGridRowId);

                parentItem.set(selectedGridColumnName, htmlEscape(htmlEncode(editor.value())));

どうすればこれを解決できますか?

4

1 に答える 1

0

解決策を見つけました。

id の代わりに uid を使用し、get の代わりに getByUid を使用しています

だからここに解決策のコードがあります

columns.Bound(product => product.Waarde).ClientTemplate("<div id='editorDiv'><div class='input'>#if(Waarde){# #if(Waarde.length>100){# # var myContent =Waarde; #  # var dcontent = myContent.substring(0,100); # <span>#=kendo.toString(dcontent)#</span> #}else{# <span>#=Waarde#</span> #}# #}#</div><div class='editor'>" +
            Html.WebCore().LinkButton(type: ButtonType.Edit, htmlAttributes: new { title = "Aanpassen", onclick = "onOpenEditorPopup('#: Waarde #', '#= uid #', 'Waarde')" })).Title("Tekst (Nederlands)");

 columns.Bound(product => product.Opmerking).ClientTemplate("<div id='editorDiv'><div class='input'>#if(Opmerking){# #if(Opmerking.length>100){# # var myContent =Opmerking; #  # var dcontent = myContent.substring(0,100); # <span>#=kendo.toString(dcontent)#</span> #}else{# <span>#=Opmerking#</span> #}# #}#</div><div class='editor'>" +
            Html.WebCore().LinkButton(type: ButtonType.Edit, htmlAttributes: new { title = "Aanpassen", onclick = "onOpenEditorPopup('#: Opmerking #', '#= uid #', 'Opmerking')" })).Title("Omschrijving");


 function onOpenEditorPopup(gridCellContent, gridIdentifier, columnIdentifier, ReadOnly, Administrator) {
        var editor = $("#waardeEditor").data("kendoEditor")

        if ((ReadOnly == "false" && Administrator == "false" && columnIdentifier != "Waarde") || ReadOnly == "true") {
            editor.body.contentEditable = false;
            $('.k-editor-toolbar').hide();
        }
        else {
            editor.body.contentEditable = true;
            $('.k-editor-toolbar').show();
        }        

        editor.value(htmlDecode(gridCellContent));
        domain.WebCore.popup.show("textEditor");

        selectedGridRowId      = gridIdentifier;
        selectedGridColumnName = columnIdentifier;
    };


domain.WebCore.popup.configure("textEditor")
        .click(function (b) {
            var grid = $("#Grid").data("kendoGrid");
            var editor = $("#waardeEditor").data("kendoEditor")
            var parentItem = grid.dataSource.getByUid(selectedGridRowId);

            parentItem.set(selectedGridColumnName, htmlEscape(htmlEncode(editor.value())));
        });
于 2014-09-03T12:36:43.397 に答える