J'essaie de changer la collection de colonnes de ma grille Kendo de la manière suivante.
var grid = $("#grid").data("kendoGrid");
$http.get('/api/GetGridColumns')
.success(function (data) {
grid.columns = data;
})
.error(function (data) {
console.log(data);
});
Cela modifie la collection de colonnes mais ne se reflète pas immédiatement dans ma grille. Mais lorsque j'essaie d'effectuer certaines actions dans la grille (comme le regroupement), mon nouveau jeu de colonnes apparaît.
Veuillez me faire savoir comment y parvenir.
Cordialement, Dilip Kumar
Vous pouvez le faire en définissant la source de données KendoUI, détruire la grille et la reconstruire
$("#load").click(function () {
var grid = $("#grid").data("kendoGrid");
var dataSource = grid.dataSource;
$.ajax({
url: "/Home/Load",
success: function (state) {
state = JSON.parse(state);
var options = grid.options;
options.columns = state.columns;
options.dataSource.page = state.page;
options.dataSource.pageSize = state.pageSize;
options.dataSource.sort = state.sort;
options.dataSource.filter = state.filter;
options.dataSource.group = state.group;
grid.destroy();
$("#grid")
.empty()
.kendoGrid(options);
}
});
});
ici, vous pouvez simplement faire ceci:
var options = grid.options;
options.columns = state.columns;
où vous pouvez récupérer les colonnes dans une session ou dans une base de données
Cela jsfiddle - Colonnes dynamiques de la grille de l'interface utilisateur de Kendo peut vous aider - en utilisant kendo.observable.
var columns = data;
var configuration = {
editable: true,
sortable: true,
scrollable: false,
columns: columns //set the columns here
};
var grid = $("#grid").kendoGrid(configuration).data("kendoGrid");
kendo.bind($('#example'), viewModel); //viewModel will be data as in jsfiddle
Pour ceux qui utilisent Kendo et Angular ensemble, voici une solution qui a fonctionné pour moi:
L'idée est d'utiliser la directive k-rebind . De la documentation:
Mise à jour du widget en cas de changement d'option
Vous pouvez mettre à jour un widget à partir du contrôleur. Utilisez l'attribut spécial k-rebind pour créer un widget qui se met à jour automatiquement lorsque certaines variables d'étendue changent. Cette option détruira le widget d'origine et le recréera en utilisant les options modifiées.
En plus de définir le tableau de colonnes dans les GridOptions comme nous le faisons normalement, nous devons y tenir une référence:
vm.gridOptions = { ... };
vm.gridColumns = [{...}, ... ,{...}];
vm.gridOptions.columns = vm.gridColumns;
puis passez cette variable à la directive k-rebind:
<div kendo-grid="vm.grid" options="vm.gridOptions" k-rebind="vm.gridColumns">
</div>
Et c'est tout lorsque vous liez la grille à des données distantes (OData dans mon cas). Vous pouvez maintenant ajouter ou supprimer des éléments dans/du tableau de colonnes. La grille va interroger à nouveau les données après leur recréation.
Lors de la liaison de la grille aux données locales (tableau local d'objets), nous devons en quelque sorte reporter la liaison des données jusqu'à ce que le widget soit recréé. Ce qui a fonctionné pour moi (il existe peut-être une solution plus propre) est d'utiliser le service $ timeout:
vm.gridColumns.Push({ ... });
vm.$timeout(function () {
vm.gridOptions.dataSource.data(vm.myArrayOfObjects);
}, 0);
Cela a été testé avec AngularJS v1.5.0 et Kendo UI v2016.1.226.
J'utilise ce code pour changer les colonnes dynamiques:
kendo.data.binders.widget.columns = kendo.data.Binder.extend({
refresh: function () {
var value = this.bindings["columns"].get();
this.element.setOptions({ columns: value.toJSON });
this.element._columns(value.toJSON());
this.element._templates();
this.element.thead.empty();
this.element._thead();
this.element._renderContent(this.element.dataSource.view());
}
});
Rafraîchissez votre grille
.success(function (data) {
grid.columns = data;
grid.refresh();
})
Voici ce que j'utilise
var columns = [];//add the columns here
var grid = $('#grid').data('kendoGrid');
grid.setOptions({ columns: columns });
grid._columns(columns);
grid._templates();
grid.thead.empty();
grid._thead();
grid._renderContent(grid.dataSource.view());
Je pense qu'une solution pour ce que vous demandez est d'appeler la méthode DataSource.read () distante équivalente à l'intérieur de la fonction. C'est ce que j'ai utilisé pour changer dynamiquement le nombre de colonnes pour les données js locales.
$("#numOfValues").change(function () {
var columnsConfig = [];
columnsConfig.Push({ field: "item", title: "Metric" });
// Dynamically assign number of value columns
for (var i = 1; i <= $(this).val(); i++) {
columnsConfig.Push({ field: ("value" + i), title: ("201" + i) });
}
columnsConfig.Push({ field: "target", title: "Target" });
columnsConfig.Push({ command: "destroy", title: "" });
$("#grid").data("kendoGrid").setOptions({
columns: columnsConfig
});
columnDataSource.read(); // This is what reloads the data
});
var newDataSource = nouveau kendo.data.DataSource ({data: dataSource}); $ ("# grille"). data ("kendoGrid"). setDataSource (newDataSource); $ ("# grille"). data ("kendoGrid"). dataSource.read ();
Si votre grille est simple et que vous n'avez pas besoin de configurer des paramètres spécifiques aux colonnes, vous pouvez simplement omettre l'argument des colonnes , comme suggéré dans la référence de l'API.
Utiliser des colonnes générées automatiquement (c'est-à-dire ne pas définir de paramètres de colonne)
... et ....
Si ce paramètre [colonne] n'est pas spécifié, la grille créera une colonne pour chaque champ de l'élément de données.
Rafraîchir la grille
$('#GridName').data('kendoGrid').dataSource.read();
$('#GridName').data('kendoGrid').refresh();
Au lieu de parcourir tous les éléments. nous pouvons supprimer toutes les données de la grille en utilisant une seule instruction
$("#Grid").data('kendoGrid').dataSource.data([]);