Jump to content

События изменения столбцов


x11

Recommended Posts

Предисловие.

Есть события, которые касаются изменения внешнего вида сетки TUniDBGrid, т.е. когда пользователь столбцы перемещает (меняет местами), меняет размер, прячет или показывает. И после изменения программист должен предоставить пользователю возможность сохранить настройки сетки. Я так и делаю - показываю кнопку Сохранить настройки таблицы.

Да, можно кнопку "Сохранить настройки" держать всё время видимой, но зачем нагружать интерфейс и показывать пользователю кнопку, которой он пользуется раз в месяц? Поэтому я показываю кнопку "Сохранить настройки таблицы" только, если пользователь изменил настройки таблицы.

Теперь вопрос.

У сетки есть события ColumnMove, ColumnResize, но нету события ColumnVisiblity. Т.е. программист не знает, что пользователь скрыл/показал какой-то столбец.

Как узнать, что пользователь скрыл или показал столбец?

Хотелось бы, чтобы разработчики фрейморка добавили событие, которое отвечает за показ и за  скрытие столбца. Или какое-то одно единое событие, например, ColumnChange, которое будет срабатывать во всех этих трех случаях: Move, Resize, Visiblity.

Спасибо.

Link to comment
Share on other sites

Что-то ты куда-то в дебри полез :) Я делаю проще (так же как в вингуе): при закрытии сохраняю состояние всех столбцов. При открытии восстанавливаю состояние. Всё происходит на серверной стороне несколькими строками кода в общем-то. Никаких дополнительных действий со стороны пользователя делать не нужно вообще, ну и обработки событий тоже не нужно, только открытие/закрытие формы.

Link to comment
Share on other sites

13 minutes ago, Tokay said:

при закрытии сохраняю состояние всех столбцов.

Зачем, если пользователь ничего не менял?

1. Ненужная нагрузка на сервер БД.

2. Засоряет ненужными данными БД.

3. Ненужная нагрузка на HTTP-сервер.

4. Ненужная нагрузка в общем, на весь сервер.

Ладно, я понимаю, если приложение с 1-2 таблицами для 1-2 пользователей, а если 100-200 таблиц и 10-50-100-500 пользователей?

Я тоже так раньше делал, но потом перешел на более рациональную модель.

Оптимизировать приложение нужно стараться уже на стадии разработки, а не когда оно начнет тормозить.

Link to comment
Share on other sites

1. Я эти данные храню в реестре, а не в базе.
2. Пользователей у нас сотни и по 50-100 столбцов в гриде. Нагрузки в общем можно сказать что и нет.
3. Дополнительной нагрузки на http не будет потому что после любого изменения они всегда синхронно отражаются на стороне бэка, будешь ли ты к этим свойствам обращаться или нет - не имеет вообще никакого значения.
4. Если уж хочется оптимизации, то точно не стоит это делать событиями. А вот спрашивать и просить признак того, что были изменения в гриде вообще, по которому опционально и сохранять данные.

Пока ты делаешь методом 'в лоб', это не оптимизация а непонятно что.

Link to comment
Share on other sites

1 hour ago, Tokay said:

В чем кошмар то? :) Отлично работает всё.

Работает абы чтоб работало? Нужно стараться уходить от таких принципов. Я считаю твой метод в корне неприемлем для веб-сервера, тем более чтобы засорять ненужными данным реестр винда. Это моё субъективное мнение. Дальнейший спор считаю флудом.

 

Link to comment
Share on other sites

59 minutes ago, Sherzod said:

Вы также можете использовать ClientEvents для этого. 

А можно подробнее?

Может есть пример?

Link to comment
Share on other sites

Я примерно понимаю, что нужно использовать либо два события columnhide + columnshow, либо одно columnschanged. Как правильно?

И в этих событиях что-то нужно отправить на сервер.

1. Я не знаю как и что именно отправлять.

2. Где на сервере в приложении ловить то, что отправлено с клиента? В событии AjaxEvent у сетки?

 

Screenshot_5.jpg

Link to comment
Share on other sites

16 minutes ago, x11 said:

columnhide + columnshow

Да

16 minutes ago, x11 said:

1. Я не знаю как и что именно отправлять.

2. Где на сервере в приложении ловить то, что отправлено с клиента? В событии AjaxEvent у сетки?

Да, с помощью ajaxRequest... 

Чуть позже я постараюсь Вам отправить рабочий пример. 

 

Link to comment
Share on other sites

2 hours ago, x11 said:

Работает абы чтоб работало? Нужно стараться уходить от таких принципов. Я считаю твой метод в корне неприемлем для веб-сервера, тем более чтобы засорять ненужными данным реестр винда. Это моё субъективное мнение. Дальнейший спор считаю флудом.

 

Нет. Работает согласно рекомендаций Майкрософт хранить данные в реестре. Дальше спорить действительно смысла не имеет.

Link to comment
Share on other sites

3 hours ago, Sherzod said:

Хотя, Вы также можете найти на форуме несколько примеров...

Ок, Нашёл этот пример

сделал аналогию

function columnhide(ct, column, eOpts)
{
  ajaxRequest(this, 'columnhide', []);
}


function columnshow(ct, column, eOpts)
{
  ajaxRequest(this, 'columnshow', []);
}

 

 

В событии OnAjaxEvent показываю сообщение:

procedure TfrdSessions.dbgSessionsAjaxEvent(Sender: TComponent;  EventName: string; Params: TUniStrings);
begin
   MyMessageBox(EventName, Params.Text);
end;

Проблема в том, что скрываю ОДНУ колонку, а события ДВА.

 

Screenshot_6.jpg

Link to comment
Share on other sites

Постаавил breake point в событии

procedure TfrdSessions.dbgSessionsAjaxEvent()

 

срабатывает 2 раза.

Не знаю почему. Пока сам разбираюсь....

Link to comment
Share on other sites

On 4/23/2020 at 4:48 PM, Sherzod said:

Можете сделать тестовый случай?

Вот, прикрепил.

Когда запустите приложение, то щёлкните слева по "Монітор підключень" - кнопка с глазом.

Появится новая вкладка с таблицей.

Как воспроизвести проблему.

В событии есть переменная-счетчик

procedure TfrdSessions.dbgSessionsAjaxEvent(Sender: TComponent;  EventName: string; Params: TUniStrings);
begin
  Inc(count);

end;


При открытии фрейма сразу загрузятся данные в таблицу. Поэтому произойдет событие "load" и переменная будет иметь значение 2.

Если вы скроете какой-нибудь столбец, то переменная будет иметь уже значение 4.

Если вы нажмете над таблице кнопку, то всплывет окно сообщения и покажет результат переменной-счётчика

unigui_event.rar

Screenshot_1.jpg

Link to comment
Share on other sites

8 minutes ago, x11 said:

unigui_event.rar

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

procedure TfrdSessions.dbgSessionsAjaxEvent(Sender: TComponent;  EventName: string; Params: TUniStrings);
begin
  Inc(count);

end;

Почему здесь Вы не используете 

if EventName = ''...

?

Link to comment
Share on other sites

Изменил код

procedure TfrdSessions.dbgSessionsAjaxEvent(Sender: TComponent;  EventName: string; Params: TUniStrings);
begin
  if EventName = 'columnhide' then
    Inc(count);
end;


count всё равно возвращает 2 при скрытии столбца

Link to comment
Share on other sites

18 minutes ago, x11 said:

да какая разница

Разница в том, что здесь все "события" отрабатываются.

17 minutes ago, x11 said:

count всё равно возвращает 2 при скрытии столбца

Я проверю.

Link to comment
Share on other sites

1 hour ago, x11 said:

count всё равно возвращает 2 при скрытии столбца

ОК, пожалуйста используйте другое имя для произвольного события, которое отличается от стандартного...

function columnhide(ct, column, eOpts)
{
    ajaxRequest(this, '_columnhide', ['colIndx=' + column.dataIndex])
}
procedure TMainForm.UniDBGrid1AjaxEvent(Sender: TComponent; EventName: string;
  Params: TUniStrings);
begin
  if EventName = '_columnhide' then
  begin
    //Params.Values['colIndx']
  end;

end;

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...