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 的第一个单元格的主要内容,如果未能解决你的问题,请参考以下文章