3

大規模なデータソースとページングを備えた剣道 UI グリッドがあります。

選択したい基になるデータ項目がわかっている場合に発生するイベントがありますが、グリッドでこの項目をプログラムでページング/選択する方法がわかりません。アイテムが現在のグリッド ページにない場合、データが現在のページにないときに datasource.view() を使用して突き抜けることはできません。

基になるデータ ソース オブジェクトによってアイテムを選択する方法を知っている人はいますか?

@: http://jsfiddle.net/Sbb5Z/1050/ にいる場所と同様の状況があります。次の方法でデータ項目を取得できます。

 change: function (e) {
      var selectedRows = this.select();
      var dataItem = this.dataItem(selectedRows[0]);
   }

しかし、他のグリッドで同じ行を選択する方法がわかりません。

基本的に、あるグリッドの選択イベントで、別のグリッドで同じアイテムを選択したいと考えています。これらはページ設定が異なるため、同じデータソースではありませんが、基になるデータ配列は同じです。

ターゲット グリッドにデータ項目がありますが、ターゲット グリッドでページング/選択する方法がわかりません。

編集: soarを思いついたのは、元のものと同じパラメーターでデータソースを作成し、探しているものが見つかるまでプログラムでページングすることです。確かにもっと良い方法があるはずですか?

4

4 に答える 4

11

これは Telerik から返ってきたもので、少しすっきりしています。

http://jsfiddle.net/RZwQ2/

function findDataItem(theGrid, dataItem) {
//get grid datasource
var ds = theGrid.dataSource;

var view = kendo.data.Query.process(ds.data(), {
                filter: ds.filter(),
                sort: ds.sort()
            })
            .data;

var index = -1;
// find the index of the matching dataItem
for (var x = 0; x < view.length; x++) {
    if (view[x].Id == dataItem.Id) {
        index = x;
        break;
    }
}

if (index === -1) {
    return;
}

var page = Math.floor(index / theGrid.dataSource.pageSize());    
var targetIndex = index - (page * theGrid.dataSource.pageSize()) + 1;    
//page is 1-based index    
theGrid.dataSource.page(++page);
//grid wants a html element. tr:eq(x) by itself searches in the first grid!    
var row = $("#grid2").find("tr:eq(" + targetIndex + ")");
theGrid.select(row);

console.log('Found it at Page: ' + page + 'index: ' + targetIndex);

}
于 2013-11-05T16:08:50.307 に答える
3

剣道で生成された UID は 2 つの異なる DataSource インスタンス間で同じにはならないため、他の dataSource 内のオブジェクトを一意に識別するために使用できるデータ内の共通 ID またはフィールドが必要です。

最も一般的には、グリッドにバインドしたモデルで id を定義します。これを使用して、データソースからアイテムをすばやく取り出すことができます。

change: function (e) {
  var selectedRows = this.select();
  var dataItem = this.dataItem(selectedRows[0]);

  var otherItem = otherGrid.dataSource.get(dataItem.id) // will get
}

モデルに共通の ID フィールドが指定されていないが、項目を見つける方法を知っている場合は、データ ソースをループして項目を探すことができます。

var selectedRows = this.select();
var dataItem = this.dataItem(selectedRows[0]);
var data = otherGrid.dataSource.view();

var otherItem;

for ( var i = 0; i < data.length; i++ ){
    if( data[i].myCommonField === dataItem.myCommonField ) {
       otherItem = data[i];
       break;
    }
}

アップデート:

他のグリッドでアイテムを選択するには、次の操作を行う必要があります。

 var elements = otherGrid.items(),
     element;

 element = elements.filter("[data-uid='" + otherItem.uid + "']")

 otherGrid.select(element) // to select just the one item

 //OR
 otherGrid.select( otherGrid.select().add(element) ) // to add the item to the current selection

あなたが提供したフィドルは、これが機能しない本当に古いバージョンの剣道グリッドを使用しています...私は気づきました。あなたは2011年版で立ち往生していますか?おそらく少なくとも理論的には何かを動作させることができますが、上記は新しいバージョンで動作します

id本質的に、持っているアイテムをDOM要素に一致させる必要があります.dom要素はすべて「data-uid」を取得するため、以降のバージョンではUIDを使用できます。定義にある場合model: { }、tr要素を取得できるように見えますdata-idjqueryを使用して正しい選択を選択するために使用できるものを持っています。代わりにitems()1 method which also doesn't seem to exist on the early version but you can usegrid2.table.find("tr[data-id=]")` を使用します

于 2013-11-04T20:00:40.133 に答える
2

div id がGridであると仮定すると、最初に kendoGrid を見つける必要があります

var grid = $("#Grid").data("kendoGrid"); 

次にgrid.select()を呼び出して現在選択されているものを選択し、最後にgrid.dataItem()を呼び出して選択した項目を取得します。

var selectedDataItem = grid.dataItem(grid.select());
于 2014-02-24T12:21:58.400 に答える