Jump to content

Фильтрация в сетке uniDBGrid


x11

Recommended Posts

в этой теме есть сетка, в которой есть очень полезный функционал - фильтры.

http://forums.unigui.com/index.php?/topic/11857-grid-filters-list/&tab=comments#comment-63164

 

Вопрос такой: как прикрутить эти фильтры именно к стандартной сетке uniDBGrid, чтобы не создавать новую компоненту. У меня не получается. Ошибок нет, приложение работает, но пункт Filters в выпадающем меню колонок отсутствует.

Хотя бы потому что, у этой сетки не работают итоги и не хочется каждый раз тратить время на переустановку одной компоненты при переустановке (при обновлении) uniGUI.

Screenshot_1.jpg

CustomDBGridFilter.rar

Link to comment
Share on other sites

По примеру из темы сделал так:

 

procedure DbgLoadFilters(dbg: TUniDBGrid);
var
 s: string;
begin
  dbg.ClientEvents.ExtEvents.Values['afterrender'] := 'function afterrender(sender, eOpts) { sender.addPlugin(''gridfilters''); }';

  for var i := 0 to pred(dbg.Columns.Count) do
  begin
    if s.IsEmpty then
      s := 'columns[' + i.ToString + '].filter = {type: ''list''};'
    else
      s := s + sLineBreak + 'columns[' + i.ToString + '].filter = {type: ''list''};'
  end;

  dbg.ClientEvents.ExtEvents.Values['reconfigure'] :=
   'function reconfigure(sender, store, columns, oldStore, oldColumns, eOpts) { ' + s + sLineBreak + '}';
end;

работает.

Теперь усложняем. Можно ли как-то в список Filters добавить свои фильтры? Там не хватает 2 важных пункта: "пустые" и "непустые". Т.е. чтобы можно было отфильтровать пустые и непустые записи (по тому и ли иному столбцу).

Спасибо.

 

Link to comment
Share on other sites

Проблема.

Если есть пустые ячейки, то этот пункт тоже есть, но если его выбрать, то фильтрация не работает. Все записи прячутся, хотя 6 записй должно остаться после включения этого пункта фильтрации.

Screenshot_11.jpg

Screenshot_12.jpg

Link to comment
Share on other sites

4 hours ago, x11 said:

Теперь усложняем. Можно ли как-то в список Filters добавить свои фильтры? Там не хватает 2 важных пункта: "пустые" и "непустые". Т.е. чтобы можно было отфильтровать пустые и непустые записи (по тому и ли иному столбцу).

 

4 hours ago, x11 said:

Если есть пустые ячейки, то этот пункт тоже есть, но если его выбрать, то фильтрация не работает. Все записи прячутся, хотя 6 записй должно остаться после включения этого пункта фильтрации.

Нужно проанализировать плагин.

Link to comment
Share on other sites

4 minutes ago, x11 said:

И еще вопрос. А слово "filters" можно как-то локализовать на другой язык, переименовать?

function afterrender(sender, eOpts)
{
    let fp = sender.addPlugin('gridfilters');
    fp.setConfig({menuFilterText: 'Фильтр'});
}

 

  • Like 1
Link to comment
Share on other sites

  • 3 weeks later...

Возникла проблема. Если заголовок многоуровневый (когда у колонок заполнено свойство GroupHeader), то появляется ошибка:

columns[2] is undefined

Подскажите, пожалуйста, где и какую проверку добавить?

Спасибо.

Screenshot_1.jpg

Link to comment
Share on other sites

Всего 19 колонок в сетке.

Проверяю цикл - тоже 19 колонок:

procedure DbgLoadFilters(dbg: TUniDBGrid);
  function GetCol(const i: string): string;
  begin
    result := 'if (columns[' + i + ']) {columns[' + i + '].filter = {type: ''list''}};';
  end;

var
 s: string;
begin

  for var i := 0 to pred(dbg.Columns.Count) do
  begin
    if s.IsEmpty then
      s := GetCol(i.ToString)
    else
      s := s + sLineBreak + GetCol(i.ToString);
  end;

//  UniSession.Log(s);

  dbg.ClientEvents.ExtEvents.Values['reconfigure'] :=
   'function reconfigure(sender, store, columns, oldStore, oldColumns, eOpts) { ' + s + sLineBreak + '}';
end;

 

вот такой код получается:

if (columns[0]) {columns[0].filter = {type: 'list'}};
if (columns[1]) {columns[1].filter = {type: 'list'}};
if (columns[2]) {columns[2].filter = {type: 'list'}};
if (columns[3]) {columns[3].filter = {type: 'list'}};
if (columns[4]) {columns[4].filter = {type: 'list'}};
if (columns[5]) {columns[5].filter = {type: 'list'}};
if (columns[6]) {columns[6].filter = {type: 'list'}};
if (columns[7]) {columns[7].filter = {type: 'list'}};
if (columns[8]) {columns[8].filter = {type: 'list'}};
if (columns[9]) {columns[9].filter = {type: 'list'}};
if (columns[10]) {columns[10].filter = {type: 'list'}};
if (columns[11]) {columns[11].filter = {type: 'list'}};
if (columns[12]) {columns[12].filter = {type: 'list'}};
if (columns[13]) {columns[13].filter = {type: 'list'}};
if (columns[14]) {columns[14].filter = {type: 'list'}};
if (columns[15]) {columns[15].filter = {type: 'list'}};
if (columns[16]) {columns[16].filter = {type: 'list'}};
if (columns[17]) {columns[17].filter = {type: 'list'}};
if (columns[18]) {columns[18].filter = {type: 'list'}};

в конечном итоге в меню просто отсутствует пункт filter

но если этот код применить к сетке, где заголовок является одноуровневым, то проблем нет

Link to comment
Share on other sites

1 hour ago, x11 said:

но если этот код применить к сетке, где заголовок является одноуровневым, то проблем нет

Да. 

Я проанализирую. 

Link to comment
Share on other sites

2 hours ago, x11 said:

но если этот код применить к сетке, где заголовок является одноуровневым, то проблем нет

Вы должны использовать примерно следующий цикл...:

 

Link to comment
Share on other sites

Простите. Я так и не понял, на что именно обратить внимание? На forEach или на проверку if (col.titleEl)?

Link to comment
Share on other sites

1 minute ago, x11 said:

Простите. Я так и не понял, на что именно обратить внимание? На forEach или на проверку if (col.titleEl)?

Здравствуйте,

Да, и на "многоуровневый" forEach:

        ...
        else if (col.columns) {
            col.columns.forEach(function(col) {
        ...

 

Link to comment
Share on other sites

13 minutes ago, x11 said:

Простите. Я так и не понял, на что именно обратить внимание? На forEach или на проверку if (col.titleEl)?

Попробуйте:

function reconfigure(sender, store, columns, oldStore, oldColumns, eOpts)
{   
    columns.forEach(function(col) {
        if (col.titleEl) {
            col.filter = {type: "list"}
        } else if (col.columns) {
            col.columns.forEach(function(col) {
                if (col.titleEl) {
                    col.filter = {type: "list"}
                }
            })

        }
    });
}

 

  • Like 1
Link to comment
Share on other sites

спасибо огромное :excl:

очень хотелось бы, чтобы функционал фильтров был бы встроен непосредственно в uniDBGrid, т.к. это очень удобно и функционально

  • Upvote 1
Link to comment
Share on other sites

15 minutes ago, Sherzod said:

Попробуйте:

но этот код можно применять только к многоуровневым заголовка, я правильно понимаю?

Link to comment
Share on other sites

  • 6 months later...
On 2/28/2021 at 2:59 PM, x11 said:

Т.е. чтобы вверху появились пункты.

 

Screenshot_10.jpg

есть один минус, при использовании фильтра типа "List", строится список тлько из данных текущей страницы (page), список по всем страницам он не строит. Использовании пагинации в гриде нужно, так как большой объем данных

Link to comment
Share on other sites

49 minutes ago, =GGG= said:

есть один минус, при использовании фильтра типа "List", строится список тлько из данных текущей страницы (page), список по всем страницам он не строит. Использовании пагинации в гриде нужно, так как большой объем данных

а также фильтрация только по текущей странице

Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...