Kendo Grid 始终专注于 Top Row 的第一个单元格

Posted

技术标签:

【中文标题】Kendo Grid 始终专注于 Top Row 的第一个单元格【英文标题】:Kendo Grid always focus on first cell of Top Row 【发布时间】:2013-11-20 16:03:23 【问题描述】:

我在剑道网格中有复选框。一旦我点击复选框,它总是关注 Kendo Grid 中的顶部单元格。下面是我在 Kendo Grid 中的复选框单击事件上绑定到复选框值的 Kendo 网格代码

    $("#contactgrid").on('click', '.chkbx', function () 
            var checked = $(this).is(':checked');
            var grid = $('#contactgrid').data().kendoGrid;
            var rowIdx = $("tr", grid.tbody).index(row);
            var colIdx = $("td", row).index(this);
            // grid.tbody.find("tr").eq(rowIndex).foucs(); This doesn't work
            var dataItem = grid.dataItem($(this).closest('tr'));
            dataItem.set('IsSelected', checked);
    );

我可以在点击事件中获取行索引和单元格索引,但我无法确定要关注特定单元格。 谢谢!

【问题讨论】:

【参考方案1】:

当您想使用复选框编辑 Grid 时,我建议您使用 this code library 中的方法。无论它使用 MVC 扩展打开 Views/Home/Index.cshtml 并查看模板是如何定义的,以及初始化 Grid 后使用的 javascript

这里是 栏目模板:

columns.Template(@<text></text>).ClientTemplate("<input type='checkbox' #= IsAdmin ? checked='checked':'' # class='chkbx' />")
            .HeaderTemplate("<input type='checkbox' id='masterCheckBox' onclick='checkAll(this)'/>").Width(200);


<script type="text/javascript">
    $(function () 
        $('#persons').on('click', '.chkbx', function () 
            var checked = $(this).is(':checked');
            var grid = $('#persons').data().kendoGrid;
            var dataItem = grid.dataItem($(this).closest('tr'));
            dataItem.set('IsAdmin', checked);
        )
    )

    function checkAll(ele) 
        var state = $(ele).is(':checked');
        var grid = $('#persons').data().kendoGrid;
        $.each(grid.dataSource.view(), function () 
            if (this['IsAdmin'] != state) 
                this.dirty=true;
            this['IsAdmin'] = state;
        );
        grid.refresh();
    

</script>

【讨论】:

感谢您的回复,我有与您提到的相同的列模板。它非常适合批量编辑和保存记录。唯一的问题是我必须关注被点击的复选框。剑道网格具有滚动条,因此每次用户选中该框时,它都会关注网格的第一个单元格。【参考方案2】:

我为此苦苦挣扎。我必须重新调整单元格,如下所示。 Kendo 网格客户端 API 有很大的改进空间。希望我下面的辅助方法可以帮助人们。

var $row = getRowForDataItem(this);
var $current = getCurrentCell($row);
var currentCellIndex = $row.find(">td").index($current);

this.set('PriceFromDateTime', resultFromDate);

$row = getRowForDataItem(this);
var grid = getContainingGrid($row);

//select the previously selected cell by it's index(offset) within the td tags
if (currentCellIndex >= 0) 
    grid.current($row.find(">td").eq(currentCellIndex));



//Kendo grid helpers
function getColumn(grid, columnName) 
    return $.grep(grid.columns, function (item) 
        return item.field === columnName;
    )[0];


function getRowForDataItem(dataItem) 
    return $("tr[data-uid='" + dataItem.uid + "']");


function getCurrentCell($elem) 
    return getContainingGrid($elem).current();


function getContainingDataItem($elem) 
    return getDataItemForRow(getContainingRow($elem));


function getContainingCell($elem) 
    return $elem.closest("td[role='gridcell']");


function getContainingRow($elem) 
    return $elem.closest("tr[role='row']");


function getContainingGrid($elem) 
    return $elem.closest("div[data-role='grid']").data("kendoGrid");


function getGridForDataItem(dataItem) 
    return getContainingGrid(getRowForDataItem(dataItem));


function getDataItemForRow($row, $grid) 
    if (!$grid) $grid = getContainingGrid($row);
    return $grid.dataItem($row);


function getMasterRow($element) 
    return $element.closest("tr.k-detail-row").prev();


function getChildGridForDataItem(dataItem) 
    return getRowForDataItem(dataItem).next().find("div.k-grid").data("kendoGrid");


function getMasterRowDataItem($element) 
    var $row = getMasterRow($element);
    return getDataItemForRow($row);

【讨论】:

感谢 Zephryl 的回复。我尝试了您的解决方案它正在接近工作,但无论最后一个复选框单击什么,它都会继续关注。我为此尝试的另一种解决方案为每个复选框提供了唯一的 ID,然后在我的 jquery 函数中找到单击的复选框并将其聚焦。以下是适合我的解决方案。 columns.Bound(p => p.Active).Title("Active").ClientTemplate("").Width(40); $(currentCheckBox).focus(); 我猜你的事件在网格更新当前单元格之前触发。而不是 var $current = getCurrentCell($row);您可能需要类似的东西:$(this).closest("td")。如果它工作正常,你可以尝试只做 $(this).closest("td").find("input").focus() 并且能够避免给他们所有唯一的ID。我假设 $(this) 对你有用。如果没有,请尝试使用 jQuery 中的事件详细信息。

以上是关于Kendo Grid 始终专注于 Top Row 的第一个单元格的主要内容,如果未能解决你的问题,请参考以下文章

Kendo Grid 可以一直处于编辑模式吗?

始终显示在 Kendo 网格中选择的第一行

kendo grid过滤

kendo ui grid 动态控制某属性

Kendo UI Web Grid 自适应渲染是不是独立于 Kendo 移动应用程序?

Kendo Grid 未在 Web API 中调用 HttpDelete 方法