我希望能够调用一个将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();
答案 0 :(得分:14)
所以这里的大部分答案都是犯了两个错误,一个只是效率问题,另一个是实际错误。
使用element.find(".k-grid-content")
。这只是大量不必要的。 grid.content
更容易(更快)为您提供完全相同的内容。
使用.offset()
查找行的位置。 这是不正确的:会告诉您行相对于文档本身的位置。如果您的页面允许您滚动整个页面(而不仅仅是网格),则此数字将不正确。
而是使用.position()
- 这会为您提供相对于偏移父项的位置。 为了让.position()
为您提供正确的数字,grid.content
中的表格必须为position: relative
。最好通过CSS样式表应用:< / p>
.k-grid-content table { position: relative; }
无论如何,假设您已经有一个引用(我将调用grid
)到网格本身,并且您的内容窗格设置为relative
位置,那么您需要做的就是是这样的:
grid.content.scrollTop(grid.select().position().top);
或者,对于动画,
grid.content.animate({ scrollTop: grid.select().position().top }, 400);
如前所述,grid.content
会为您提供内容窗格,即您要实际滚动的部分。它是一个jQuery对象。
jQuery对象有一个.scrollTop
方法,因此该部分非常简单。使用scrollTop
属性时,.animate
方法的工作方式类似。现在我们只需要知道将滚动到的位置。
为此,grid.select()
返回与所选行对应的jQuery对象。您想要将滚动到的位置。为了获得它的位置,我们使用jQuery .position()
方法。返回值是包含top
和left
字段的对象;我们想滚动到它的垂直位置,所以我们使用top
。
当然,这在change
回调中最容易使用; grid
只是this
(因为回调是在网格本身上调用的),并且当选择更改时会自动调用change
。但是,只要您想要滚动到选择,就可以调用此代码;您可以使用以下方式获取grid
:
grid = $('#theGridsId').data('kendoGrid');
答案 1 :(得分:6)
选择行时可以自动执行此操作。 将功能绑定到“更改”状态。事件,在那里,您可以滚动到所选行。 (假设您只能选择一行,这是由&#39; this.select()&#39;)
&#39;变更&#39;处理
// 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);
}
答案 2 :(得分:0)
这是更新的代码 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) {
}
}
答案 3 :(得分:0)
我的偏移有问题所以位置对我来说效果更好:
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);
答案 4 :(得分:0)
我在Kendo移动MVVM中找到了这个功能
parent.set('onShow', function (e) {
e.view.scroller.reset();
}
或
app.xxx = kendo.observable({
onShow: function() { e.view.scroller.reset(); }
});