J'ai une grille contenant trois contrôles multisélect dans la barre d'outils qui doivent être utilisés pour filtrer la source de données de la grille en fonction des sélections effectuées. À l'heure actuelle, j'ai la fonction ci-dessous, déclenchée au cours d'un événement change
dans l'un des contrôles multisélect. Cette fonction accepte values
contenant les éléments sélectionnés dans le contrôle multisélect modifié et filterID
qui est le nom field
à utiliser pendant le filtrage.Filtrage personnalisé avec des listes déroulantes à sélection multiple
function applyClientFilters(values, filterID) {
var grid = $("#grid").data("kendoGrid");
var gridDataSource = grid.dataSource;
var filter = gridDataSource.filter();
// does the selected drop down contain a value
// if yes, then apply this filter to the necessary drop down
// otherwise remove the filter
if (values.length > 0) {
// has a filter been setup yet on the datasource?
if (filter && filter.filters.length > 0) {
// firstly check to see if filter has already been applied and if so remove
for (var i = 0; i < filter.filters.length; ++i) {
// check to see if filter field already exists i.e. analyte has already been filtered
// and check to see if the value at this field already exists as a filtered item
if (filter.filters[i].field === filterID && values.indexOf(filter.filters[i].value) > -1) {
filter.filters.splice(i, 1);
}
}
// apply new filter(s)
for (var i = 0; i < values.length; ++i) {
filter.filters.push({ field: filterID, operator: "eq", value: parseInt(values[i]) });
}
gridDataSource.query({
filter: filter,
pageSize: 10,
page: 1,
group: [{
field: "InstrumentName",
dir: "asc"
}, {
field: "AnalyteName",
dir: "asc"
}, {
field: "MethodName",
dir: "asc"
}]
});
}
else {
// apply new filter
gridDataSource.filter({
logic: "or",
filters: [
{
field: filterID,
operator: "eq",
value: parseInt(values),
}
]
});
}
} else {
if (filter && filter.filters.length > 0) {
// remove existing filter
for (var i = 0; i < filter.filters.length; ++i) {
if (filter.filters[i].field === filterID) {
filter.filters.splice(i, 1);
}
}
gridDataSource.query({
filter: filter,
pageSize: 10,
page: 1,
group: [{
field: "InstrumentName",
dir: "asc"
}, {
field: "AnalyteName",
dir: "asc"
}, {
field: "MethodName",
dir: "asc"
}]
});
}
}
}
En utilisant seulement la logique or
lors du filtrage est très bien avec une sélection individuelle de multiselect à-dire la sélection de plusieurs méthodes leur filtrage comme prévu. Cependant, la logique doit être and
lorsqu'elle est utilisée dans différents contrôles multisélect.
Exemple
- Sélectionnez 'Analyte A' -> filtres grille source de données à l'affichage uniquement 'Analyte A'
- Sélectionnez 'Méthode A' -> filtres grille source de données pour afficher 'Analyte A' et 'Méthode A'
- Sélectionnez 'Méthode B' -> filtres grille source de données pour afficher 'Analyte A' et 'Méthode A' ou 'Méthode B'
Est-il possible de combiner des opérateurs de logique de filtrage avec un filtrage de source de données Kendo pour réaliser le scénario ci-dessus?