Поведение столбца в раскрывающемся окне данных по сравнению с фильтром

У меня есть окно данных, содержащее x строк. Первый столбец, который я назову «сотрудник», представляет собой раскрывающееся окно данных со столбцом данных, указывающим на поле идентификатора сотрудника, и столбцом отображения, указывающим на поле имени сотрудника. При добавлении строки этот столбец заполняется на основе раскрывающегося списка пользователя. Кроме того, фильтр применяется к DatawindowChild столбца сотрудников, так что пользователь не может выбрать сотрудника, который не соответствует текущему фильтру.

Проблема:

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

Что было бы умным обходным путем?

Кроме того, следует учитывать еще одну вещь: я не могу применить соответствующий фильтр к основному окну данных, потому что одно из требований состоит в том, чтобы все строки всегда оставались видимыми.

Заранее спасибо.

Изменить: Powerbuilder 2017 R2.


person Trashface    schedule 04.10.2018    source источник


Ответы (2)


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

person Gokul Kannan    schedule 05.10.2018
comment
Эта половина работает, но при повторном применении фильтра ссылки на столбцы дисплея по-прежнему прерываются. Если бы существовал способ предотвратить изменение отображаемого значения столбца, я бы смог это сделать. - person Trashface; 05.10.2018
comment
Можете ли вы попробовать SetRedraw False - person Gokul Kannan; 08.10.2018

Итак, попробовав все уловки, которые я мог придумать с помощью фильтров и что-то не так, я остановился на беспорядочном решении, которое частично подрывает поведение окна данных, но работает.

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

Я сделал новый столбец раскрывающегося окна данных сотрудника с отображением и столбцами данных, указывающими на поле имени сотрудника. Пользователь выбирает имя сотрудника, а затем идентификатор сотрудника вручную выбирается из дочернего окна данных с помощью команд Find и GetItemString, где это необходимо. В результате раскрывающееся окно данных больше не может управлять данными - теперь это нужно делать вручную в коде, - но при изменении выражений фильтра не происходит визуальных изменений существующих строк.

До:

ls_employee = dw_1.GetItemString(row, "employee") //Returns employee ID

После:

ls_employee = dw_1.GetItemString(row, "employee") //Returns employee name
ls_employee = ldwc_employee.GetItemString(ldwc_employee.Find("employee_name = '" + ls_employee + "'", 1, ldwc_employee.RowCount()), "employee_id") //Find row number and fetch ID

Затем, поскольку пользователь фактически больше не вставляет значения PK / FK в таблицу, идентификатор сотрудника должен быть вручную установлен в столбце старого (скрытого) идентификатора сотрудника перед вызовом обновления.

dw_1.SetItem(row, "employee_id", ls_employee)

Я не совсем доволен этим решением, поскольку оно делает бессмысленным использование раскрывающегося окна данных. Он также не учитывает случаи, когда поиск может вернуть неправильный номер строки, если у двух сотрудников совпадают имя и фамилия, но это приемлемо в моем случае, потому что такие ситуации крайне маловероятны.

Так что я не горжусь этим, но, тем не менее, так оно и есть.

person Trashface    schedule 11.10.2018