Кендо для jQuery: показать один из двух различных элементов управления в каждой ячейке столбца сетки

#jquery #dynamic #kendo-ui #controls #creation

Вопрос:

Я использую кендо для jQuery. У меня есть сетка, в которой каждая ячейка столбца должна отображать либо раскрывающийся элемент управления, либо элемент управления вводом текста. Я нашел здесь метод для отображения одного или другого во всех ячейках данного столбца, но не для выполнения этого по строкам, ячейка за ячейкой.

 let searchValue = '';
let selectedTab = 0;

$(document).ready(function () {

    // SET UP TAB

    $("#tabstrip").kendoTabStrip({
        animation: {
            open: {
                effects: "fadeIn"
            }
        }
    });

    // RETRIEVE GRID DATA

    const pendingGridDataSource = new kendo.data.DataSource({
        transport: {
            read: function (options) {
                $.ajax({
                    url: `/pending/Index?searchValue=${searchValue}`,
                    contentType: "application/json",
                    dataType: 'json',
                    type: "POST",
                    data: JSON.stringify(options.data),
                    success: function (result) {
                        options.success(result);
                    }
                })
            },
            create: function (options) {
                $.ajax({
                    url: "/pending/Create",
                    contentType: "application/json",
                    dataType: 'json',
                    type: "POST",
                    data: JSON.stringify(options.data),
                    success: function (result) {
                        options.success(result);
                    }
                })
            },
            update: function (options) {
                $.ajax({
                    url: "/pending/Update",
                    contentType: "application/json",
                    dataType: 'json',
                    type: "POST",
                    data: JSON.stringify(options.data),
                    success: function (result) {
                        options.success(result);
                    }
                })
            },
            destroy: function (options) {
                $.ajax({
                    url: "/pending/Delete",
                    contentType: "application/json",
                    dataType: 'json',
                    type: "POST",
                    data: JSON.stringify(options.data),
                    success: function (result) {
                        options.success(result);
                    }
                })
            },
            parameterMap: function (options, operation) {
                if (operation !== "read" amp;amp; options.models) {
                    return { models: kendo.stringify(options.models) };
                }
            }
        },
        sort: { field: "work_date", dir: "desc" },
        schema: {
            model: {
                id: "cost_index",
                fields: {
                    client_name: { type: "string", editable: false },
                    matter: { type: "string", editable: false },
                    narrative: { type: "string", editable: false },
                    cost_type_description: { type: "string" },
                    business_purpose: { type: "string" },
                    venue: { type: "string" },
                    work_date: { type: "date" },
                    post_date: { type: "date" },
                    work_amt: { type: "number" },
                    partner_work_amt: { type: "number", editable: false },
                    timekeeper_name: { type: "string", editable: false }
                }
            }
        },
        sort: { field: "work_date", dir: "desc" }
    });


    // BUILD THE GRID

    const pendingGrid = $("#pending").kendoGrid({
        dataSource: pendingGridDataSource,        
        editable: true, 
        filterable: true,
        sortable: true,
        detailInit: pendingSubGrid,
        schema: {
            model: {
                fields: {
                    narrative: {},
                    cost_type_description: {},
                    client_name: {},
                    matter: {},
                    business_purpose: {},
                    venue: {},
                    work_date: {},
                    post_date: {},
                    work_amt: {},
                    partner_work_amt: {},
                    timekeeper_name: {},                    }
            }
        },
        columns: [
            {
                field: "narrative",
                title: "Narrative",
                width: "300px",
            },
            {
                //field: "cost_type_description",
                //title: "Cost Type Description1",
                field: "cost_type_description",
                title: "Expense Type",
                template: columnTemplateFunction,
                filterable: {
                    operators: {
                        string: {
                            contains: "Contains",
                            eq: "Is equal to",
                            neq: "Is not equal to"
                        }
                    }
                }
            },          
            {
                field: "client_name",
                title: "Client",
                width: "150px",
            },
            {
                field: "matter",
                title: "Matter Number",
                width: "155px",
            },
            {
                field: "business_purpose",
                title: "Purpose",
            },
            {
                field: "venue",
                title: "Venue",
            },
            {
                field: "work_date",
                title: "Expense Date",
                format: "{0:MM/dd/yyyy}",
                width: "140px"
            },
            {
                field: "post_date",
                title: "Post Date",
                format: "{0:MM/dd/yyyy}",
                width: "130px"
            },
            {
                field: "work_amt",
                title: "Amount",
                width: "120px",
                format: "{0:c}"
            },
            {
                field: "partner_work_amt",
                title: "Partner Share",
                width: "140px",
                format: "{0:c}"
            },            
            {
                field: "timekeeper_name",
                width: "140px",
                title: "Timekeeper",
            },
            { command: ["edit", "destroy", { text: "Approve", click: ApprovePending }, { text: "Reject", click: RejectPending }], width: "350px" }
        ],
        dataBound: function (e) {
            var grid = e.sender;
            var items = e.sender.items();

            items.each(function (e) {
                var i = 0;
                var dataItem = grid.dataItem(this);
                var ddt = $(this).find('.dropDownTemplate');
                //if (i == 0) {
                $(ddt).kendoDropDownList({
                    enable: false,
                    value: getET(), //dataItem.value,
                    dataSource: ddlDataSource,
                    dataTextField: "displayValue",
                    dataValueField: "value",
                    change: onDDLChange
                });
                //}
                i = i   1;
            });
        },
        editable: "inline"
    }).data("kendoGrid");

    // VALUES FOR THE DROPDOWNS

    var ddlDataSource = [{
        value: 1,
        displayValue: "Select Expense Type"
    },
    {
        value: 2,
        displayValue: "Gifts"
    },
    {
        value: 3,
        displayValue: "MSG"
    }
    ];

    function getET() {
        return "2"
    };

    function columnTemplateFunction(dataItem) {
        var i = 1;
        if (i == 0)
            var input = '<input class="dropDownTemplate"/>'
        else
            return "<strong>"   kendo.htmlEncode(dataItem.name)   dataItem   "</strong>"
        //return "<strong>"   dataItem   "</strong>"
        return input
    };

    function onDDLChange(e) {
        var element = e.sender.element;
        var row = element.closest("tr");
        var grid = $("#grid").data("kendoGrid");
        var dataItem = grid.dataItem(row);

        dataItem.set("value", e.sender.value());
    };
});
 

Комментарии:

1. Не могли бы вы, пожалуйста, поделиться каким-нибудь кодом о том, что вы сделали до сих пор?

2. пытаясь. он продолжает говорить, что я только публикую код.

3. хорошо, есть ошибка на SO…it помечает неправильно отформатированный код и продолжает отмечать его как таковой даже после того, как вы его исправили. вы должны начать все сначала и снова вставить исправленный код.

Ответ №1:

Не могу использовать ваш минимальный рабочий пример, так как у меня нет этих конечных точек. Итак, вот пример, где в каждой ячейке столбца отображается либо раскрывающийся список, либо текстовое поле. Мясо находится в editor функции. В столбце Состояние, если ссылка превышает 999, отображается раскрывающийся список, в противном случае отображается текстовое поле. Должно быть достаточно ясно в коде. Я полагаю, что это то, что вы ищете, как указано в заголовке «показать один из двух разных элементов управления в каждой ячейке столбца сетки». Попробуйте код ниже в ДОДЗЕ Телерика.

 <!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Kendo Grid Different Input Control in Column</title>
  
  <link rel="stylesheet" href="https://kendo.cdn.telerik.com/2020.3.1118/styles/kendo.default-v2.min.css"/>

  <script src="https://code.jquery.com/jquery-1.12.3.min.js"></script>
  <script src="https://kendo.cdn.telerik.com/2021.2.616/js/kendo.all.min.js"></script></head>
<body>
  
<div id="example">
    <div id="grid"></div>

<script>
    $(document).ready(function() {
        var grid = $('#grid').kendoGrid({
            persistSelection: true,
            selectable: 'cell',
            editable: true,
            dataSource: [{
                reference: 100,
                state: 'Pending',
            },{
                reference: 1000,
                state: 'Pending',
            }],
            columns: [{
                editable: function() { return false; },
                field: 'reference',
                title: 'Reference',
                width: 100,
            },{
                field: 'state',
                title: 'State',
                width: 200,
                attributes: {
                    'title': 'Click to edit',
                },
                editor: function(container, options) {
                    if (options.model.reference > 999) {
                        $('<input name="'   options.field   '" />')
                            .appendTo(container)
                            .kendoDropDownList({
                                optionLabel: 'Select Expense Type',
                                dataSource: ['Gifts', 'MSG'],
                        });
                    } else {
                        $('<input name="'   options.field   '" />')
                            .appendTo(container)
                            .kendoTextBox({
                                
                        });
                    }
                },
            }],
        }).data('kendoGrid');
    });
</script>
</div>  
</body>
</html> 

Комментарии:

1. Администраторы отметили этот вопрос как ответ, и это действительно было так. Спасибо за помощь мне… Я надеюсь… произвожу хорошее впечатление на своей новой должности!

2. @cmabe Это здорово. Если этот ответ полезен, пожалуйста, повысьте голос и/или отметьте его как принятый ответ.