Иногда и такое нужно. Как пример -- есть окно с несколькими гридами на основе записей меморидатасет. Записей много -- поэтому у клиента возникает необходимость их быстро искать.
Сам фильтр сложно реализовать(потому что при закрытии, как известно, меморидатасет очищается. тем более, если функционал сложный, то при "собирании заново" тратится время на проверку всех условий и т.п.), но можно сделать иначе: просто выделять нужные записи.
Как это работает -- ищет по полям, где содержится слово, введенное в поле (то есть, принцип тот же, что и в обычном поиске, тип поиска можно поменять в системных настройках) -- и выделяет найденные записи. При нажатии на "крестик"(то есть "убираем" быстрый поиск) оно снимает выделение.
Этот код можно добавить прямо в скрипт scr_BaseMemDSGridArea, а в окошке wnd_BaseMemDSGridArea прописать на гриде события grdDataOnQuickFilter (запуск быстрого фильтра) и grdDataOnClearFilter (снятие быстрого фильтра).
Еще момент -- код "ориентируется" на поле ID в мемори датасете, поэтому, если у Вас такого поля нет, то нужно или добавить его, или соответствующе изменять функции.
function grdDataOnQuickFilter(DataGrid, DataField, Value, QuickFilterLikeType, DoFilter, DoQuickFilter) {
DataGrid.DisableEvents(); //debugger;
var QuickFilterLikeType = GetSystemParameterValueEx('QuickFilterLikeType');
LastSearchRecordID = LocateOnSearchRecord(DataGrid, dlData.Dataset,DataField.Name,Value,QuickFilterLikeType);
DataGrid.EnableEvents();
if (!!LastSearchRecordID) {
if (dlData.Dataset('ID') != LastSearchRecordID) {
DataGrid.UnSelectRow(dlData.Dataset('ID'));
}
} else {
DataGrid.UnSelectRow(dlData.Dataset('ID'));
}
}
function LocateOnSearchRecord(Grid, DS, DataFieldName, DataFieldValue, FilterType) {
//debugger;
var Count = DS.RecordsCount;
if (!Count) {
return;
}
var SelectedIDsCount = Grid.SelectedIDs.Count;
if (!!SelectedIDsCount) {
Grid = UnSelectSelectedIDs(Grid);
} else {
Grid.UnSelectRow(DS('ID'));
}
DS.GotoFirst();
var SearchArray = new Array();
for (var i = 0; i Count; i++) {
if (IsSearchValueInCurrentDSRecord(DS,DataFieldName,DataFieldValue, FilterType)) {
SearchArray.push(DS('ID'));
}
DS.GotoNext();
}
var LastSearchRecordID = null;
if (!!SearchArray.length) {
SelectSearchRecords(Grid, SearchArray);
LastSearchRecordID = SearchArray[SearchArray.length - 1];
}
return LastSearchRecordID;
}
function UnSelectSelectedIDs(Grid) { //
var Count = Grid.SelectedIDs.Count;
var SelectedIDs = GetArrayByCollection(Grid.SelectedIDs);
for (var i=0; i Count; i++) {
Grid.UnSelectRow(SelectedIDs[i]);
}
return Grid;
}
function IsSearchValueInCurrentDSRecord(DS,DataFieldName,DataFieldValue, FilterType) { //debugger;
var CurrentDataFieldValue = DS(DataFieldName);
CurrentDataFieldValue = CurrentDataFieldValue.toString();
DataFieldValue = DataFieldValue.toString();
var Result = false;
switch (FilterType.toString()) {
case qfltEqual:
Result = (CurrentDataFieldValue == DataFieldValue); //поле равно значению
break;
case qfltDefault:
case qfltContain:
Result = (CurrentDataFieldValue.indexOf(DataFieldValue) != -1); //значение содержится в поле
break;
case qfltStartsWith:
Result = (CurrentDataFieldValue.substr(0,DataFieldValue.length) == DataFieldValue); //поле начинается со значения
break;
case qfltEndsWith:
Result = (CurrentDataFieldValue.substr(CurrentDataFieldValue.length-DataFieldValue.length+1, DataFieldValue.length) == DataFieldValue); //поле заканчивается значением
break;
}
return Result;
}
function SelectSearchRecords(Grid, SearchArray) {
for (var i=0; i SearchArray.length; i++) {
Grid.SelectRow(SearchArray[i]);
}
}
function grdDataOnClearFilter(DataGrid) {
DataGrid.DisableEvents();
UnSelectSelectedIDs(DataGrid) ;
DataGrid.EnableEvents();
}