我希望能够调用将 Kendo 网格滚动到选定行的函数。我已经尝试了一些方法,但都没有用,
例如我试过这个:
var grid = $("#Grid").data("kendoGrid"),
content = $(".k-grid-content");
content.scrollTop(grid.select());
我也试过这个:
var gr = $("#Grid").data("kendoGrid");
var dataItem = gr.dataSource.view()[gr.select().closest("tr").index()];
var material = dataItem.id;
var row = grid.tbody.find(">tr:not(.k-grouping-row)").filter(function (i) {
return (this.dataset.id == material);
});
content.scrollTop(row);
有人能指出我正确的方向吗? :)
---编辑---
出于其他原因,我无法绑定到更改事件,因此我必须能够调用一个函数将列表滚动到选定的行。这就是我尝试使用@Antonis 为我提供的答案。
var grid = $("#Grid").data("kendoGrid")
grid.element.find(".k-grid-content").animate({
scrollTop: this.select().offset().top
}, 400);
当我尝试这样做时,它会向下滚动列表,但不会滚动到选定的行。我是否通过调用 scrollTop 以错误的方式使用网格对象?
这也是:
var grid = $("#ItemGrid").data("kendoGrid");
grid.scrollToSelectedRow = function () {
var selectedRow = this.select();
if (!selectedRow) {
return false;
}
this.element.find(".k-grid-content").animate({
scrollTop: selectedRow.offset().top
}, 400);
return true;
};
grid.scrollToSelectedRow();
所以这里的大部分答案都犯了两个错误,一个只是效率问题,另一个是实际错误。
使用
element.find(".k-grid-content")
。这完全没有必要。 grid.content
更容易(更快)为您提供完全相同的东西。.offset()
找到行的位置。 这是不正确的: 会告诉您该行相对于文档本身的位置。如果您的页面允许您滚动整个页面(而不仅仅是网格),则此数字将不正确。
.position()
– 这为您提供了相对于偏移父项的位置。 为了.position()
给你正确的数字,你的grid.content
中的表格必须有position: relative
。最好通过CSS样式表应用:
.k-网格内容表{ 位置:相对; }
无论如何,假设你已经有一个引用,我称之为
grid
,到网格本身,并且你的内容窗格设置为 relative
位置,你所要做的就是:
grid.content.scrollTop(grid.select().position().top);
或者,对于动画,
grid.content.animate({ scrollTop: grid.select().position().top }, 400);
如前所述,
grid.content
为您提供内容窗格,即您真正想要滚动的部分。它是一个 jQuery 对象。
.scrollTop
方法,所以这部分非常简单。当您使用其 .animate
属性时,
scrollTop
方法的工作方式类似。现在我们只需要知道在哪里滚动到.
grid.select()
返回对应于所选行的 jQuery 对象。那就是你想要滚动到的地方。为了获得它的位置,我们使用 jQuery .position()
方法。返回值是一个带有top
和left
字段的对象;我们想滚动到它的垂直位置,所以我们使用top
.
这个在
change
回调中使用最方便,当然; grid
只是 this
(因为回调是在网格本身上调用的),并且 change
在选择更改时自动调用。但是您可以在任何时候想要滚动到选择时调用此代码;你可以通过使用获得grid
:
grid = $('#theGridsId').data('kendoGrid');
您可以在选择一行时自动执行此操作。 将一个函数绑定到 'change' 事件,在那里,您可以滚动到选定的行。 (假设你只能选择一行,这是由 'this.select()' 给出的)
“更改”处理程序
// bind to 'change' event
function onChangeSelection(e) {
// animate our scroll
this.element.find(".k-grid-content").animate({ // use $('html, body') if you want to scroll the body and not the k-grid-content div
scrollTop: this.select().offset().top // scroll to the selected row given by 'this.select()'
}, 400);
}
这是更新后的代码 http://jsfiddle.net/27Phm/12/
// bind to 'change' event
function onChangeSelection(e) {
try {
var $trSelect = this.select();
var $kcontent = this.element.find(".k-grid-content");
if ($trSelect && $trSelect.length == 1 && $kcontent) {
var scrollContentOffset = this.element.find("tbody").offset().top;
var selectContentOffset = $trSelect.offset().top;
var IsMove = false;
var distance = selectContentOffset - scrollContentOffset;
distance += $kcontent.offset().top;
if ($trSelect.prev().length == 1 && distance > $trSelect.prev().offset().top) {
distance = (distance - $trSelect.prev().offset().top); //+ ($trSelect.height());
//var toprows = $kcontent.scrollTop() / $trSelect.height(); //top rows above the scroll
var selrowtotal = ($trSelect.offset().top - $kcontent.offset().top) + $trSelect.height();
IsMove = selrowtotal > $kcontent.height() ? true : false;
if (IsMove) $kcontent.scrollTop(distance);
}
if (!IsMove && $trSelect.offset().top < $kcontent.offset().top) {
distance = selectContentOffset - scrollContentOffset;
$kcontent.scrollTop(distance - 15);`enter code here`
}
}
} catch (e) {
}
}
我在偏移方面有问题,所以位置对我来说效果更好:
grid.element.find(".k-grid-content").animate({ // use $('html, body') if you want to scroll the body and not the k-grid-content div
scrollTop: this.select().position().top // scroll to the selected row given by 'this.select()'
}, 400);
我在 Kendo mobile MVVM 中找到了一个功能
parent.set('onShow', function (e) {
e.view.scroller.reset();
}
或
app.xxx = kendo.observable({
onShow: function() { e.view.scroller.reset(); }
});
除了已经说的,如果你使用虚拟卷轴 例如JQuery:
$("#grid").kendoGrid({
scrollable: {
virtual: true
}});
或在 ASP.NET MVC 中
.Scrollable(scrollable => scrollable.Virtual(true))
...像这样滚动到选定的行:
div
我一直在努力解决这个问题,所以也许它可以帮助某人节省一些时间。