Сохранение текущей строки при перезаполнении ТаблицыФормы
Всем привет. Имеется таблица формы, перезагружаем данные в нее, нужно после перезагрузки данных сохранить текущую строку активной.
Делаю так:
Не работает, при обновлении все равно перескакивает на первую строку.
Делаю так:
&НаКлиенте
Процедура ОбновитьДанныеСписка()
ТекущийИД = ЭтаФорма.Элементы.ДанныеСписка.ТекущиеДанные.ИдентификаторЗаписи;
ОбновитьДанныеСпискаНаСервере();
МассивПоИД = ДанныеСписка.НайтиСтроки(Новый Структура("ИдентификаторЗаписи", ТекущийИД));
Если МассивПоИД.Количество() > 0 Тогда
ЭтаФорма.Элементы.ДанныеСписка.ТекущаяСтрока = МассивПоИД[0];
КонецЕсли;
КонецПроцедуры
ПоказатьНе работает, при обновлении все равно перескакивает на первую строку.
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(5) Xershi,
У меня имеется некоторый регистр сведений, в котором как одно из измерений хранится строка с неким внешним ИД, уникальным для данного регистра. Так вот, мне необходимо, что бы пользователь, работая со строкой №10, ИД которой = 123, после обновления списка остался на той же строке (ид которой = 123), даже если теперь эта строка будет №11.
Этот массив результат НайтиСтроки по сохраненному ИД в таблице формы.
Равен массиву с одним элементом.
ДанныеФормыЭлементКоллекции, т.е. та строка, на которую мне нужно сделать фокус.
Хм, почему-то Неопределено...
а что в вашем понимании сохранить текущую строку. Вы же все переписываете?
У меня имеется некоторый регистр сведений, в котором как одно из измерений хранится строка с неким внешним ИД, уникальным для данного регистра. Так вот, мне необходимо, что бы пользователь, работая со строкой №10, ИД которой = 123, после обновления списка остался на той же строке (ид которой = 123), даже если теперь эта строка будет №11.
Если у вас есть ИД строки, вы его запомнили, затем обновили список. Затем появляется некий МассивПоИД.
Этот массив результат НайтиСтроки по сохраненному ИД в таблице формы.
Так вот в отладчике чему он равен?
Равен массиву с одним элементом.
И если он больше 0, то что содержит МассивПоИД[0]?
ДанныеФормыЭлементКоллекции, т.е. та строка, на которую мне нужно сделать фокус.
И результат нам.
Хм, почему-то Неопределено...
(8) Xershi, а как нужно? Если совсем абстрагироваться от деталей задачи, то мне сейчас просто нужно в таблице формы выделить строку, которая содержит нужное мне значение. Традиционное замечание, что в обычных формах это делается элементарно :). А вот как это сделать в управляемых?
Если у вас есть ИД строки, вы его запомнили, затем обновили список. Затем появляется некий МассивПоИД. Так вот в отладчике чему он равен?
И если он больше 0, то что содержит МассивПоИД[0]?
А далее добавляем после условия код
И результат нам.
И если он больше 0, то что содержит МассивПоИД[0]?
А далее добавляем после условия код
сообщить(ЭтаФорма.Элементы.ДанныеСписка.ТекущаяСтрока);
И результат нам.
Кажется нащупал проблему. Если код:
вынести в команду и руками ее запускать, то строка позиционируется просто чудесно. Получается, что несмотря на то, что список был обновлен на сервере, и в ДанныеСписка на клиенте уже есть новые записи, в ЭтаФорма.Элементы.ДанныеСписка этих записей еще как бы нет. Выходит так?) На всякий случай приведу текст ОбновитьДанныеСпискаНаСервере()
ТекущийИД = "8b1876eb-a5c3-4d35-a0d6-5b495a6445c2";
МассивПоИД = ДанныеСписка.НайтиСтроки(Новый Структура("ИдентификаторЗаписи", ТекущийИД));
Если МассивПоИД.Количество() > 0 Тогда
ЭтаФорма.Элементы.ДанныеСписка.ТекущаяСтрока = МассивПоИД[0].ПолучитьИдентификатор();
КонецЕсли;
вынести в команду и руками ее запускать, то строка позиционируется просто чудесно. Получается, что несмотря на то, что список был обновлен на сервере, и в ДанныеСписка на клиенте уже есть новые записи, в ЭтаФорма.Элементы.ДанныеСписка этих записей еще как бы нет. Выходит так?) На всякий случай приведу текст ОбновитьДанныеСпискаНаСервере()
&НаСервере
Процедура ОбновитьДанныеСпискаНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|*,
| НЕДЕЛЯ(РегистрСведенийЖурналЗаявок.Дата) КАК НомерНедели
|ИЗ
| РегистрСведений.ЖурналЗаявок КАК РегистрСведенийЖурналЗаявок
|ГДЕ
| РегистрСведенийЖурналЗаявок.Дата МЕЖДУ &НачалоПериода И &КонецПериода";
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(НачалоПериода));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(КонецПериода));
РезультатЗапроса = Запрос.Выполнить();
ДанныеСписка.Загрузить(РезультатЗапроса.Выгрузить());
КонецПроцедуры
Показать
Изменил с
на
Теперь необходимая мне строка остается выделенной, но тем не менее, при окончании редактирования фокус смещается на первую строку. Получается что у меня выделено 2 строки нужная мне и первая, при том, что в ТаблицеФормы запрещен множественный выбор. Как быть? Как при окончании редактирования запретить автоматически изменять фокус на первую строку?
Второй день сижу над такой простой задачей, просто слов нет...
ДанныеСписка.Загрузить(РезультатЗапроса.Выгрузить());
на
ЗначениеВРеквизитФормы(РезультатЗапроса.Выгрузить(), "ДанныеСписка");
Теперь необходимая мне строка остается выделенной, но тем не менее, при окончании редактирования фокус смещается на первую строку. Получается что у меня выделено 2 строки нужная мне и первая, при том, что в ТаблицеФормы запрещен множественный выбор. Как быть? Как при окончании редактирования запретить автоматически изменять фокус на первую строку?
Второй день сижу над такой простой задачей, просто слов нет...
Я бы сформулировал ключ строки, запомнил его где-то в реквизитах например формы, потом нашел бы в таблице после перезаполнения.
Наверное ведь есть какой-то набор колонок таблицы, которые составляют уникальный ключ строки.
Наверное ведь есть какой-то набор колонок таблицы, которые составляют уникальный ключ строки.
(22) starjevschik, уникальный ключ есть. По нему нахожу нужную строку и позиционируюсь на ней. Она становится выделенной, однако при этом выделяется и первая строка (хотя множественный выбор отключен) Получается, что в списке выделено 2 строки, та которая нужна и первая. Как это побороть, пока не понятно.
Такая же проблема! Есть ТабличноеПоле с СпискомЗначений оно не обновляется. При обработке события "Выбор" есть переход на серверную процедуру, по возвращению с нее ТекущиеДанные теряются и фокус с нужной строки уходит на первую. Уже сломал голову что только не пробывал!
на точке останова "установить видимость"
элемент.ТекДанные неопределено, ТекущаяСтрока не определено. Только ВыбраннаяСтрока сохраняет номер. Но ничего с ним не сделать! номер больше кол-ва строк в таблице.
на точке останова "установить видимость"
элемент.ТекДанные неопределено, ТекущаяСтрока не определено. Только ВыбраннаяСтрока сохраняет номер. Но ничего с ним не сделать! номер больше кол-ва строк в таблице.
&НаКлиенте
Процедура СписокВыбораВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Объект.ТекID = Формат(Элемент.ТекущиеДанные.TYP_ID, "ЧГ=0");
ПостроитьДеревоГруппНаСервере();
УстановитьВидимость("СтраницаВыборГруппыОткрыть");
КонецПроцедуры
&НаСервере
Процедура ПостроитьДеревоГруппНаСервере() Экспорт
ТекущийОбъект = ЭтотОбъект();
ТекущийОбъект.ПостроитьДеревоГрупп();
ЭтотОбъект(ТекущийОбъект);
КонецПроцедуры
Показать
Если количество строк до перезаполнения и после однозначно совпадает, то можно так:
//запомним текущую строку
ИДТекущейСтрокиП = Элементы.ТЧ.ТекущаяСтрока;
Если ИДТекущейСтрокиП <> Неопределено Тогда
ТекущНомерСтрокиП = ТЧ.НайтиПоИдентификатору(ИДТекущейСтрокиП).НомерСтроки;
Иначе
ТекущНомерСтрокиП = Неопределено;
КонецЕсли;
ЗаполнитьТЧ();
//установим текущую строку
Если ТекущНомерСтрокиП <> Неопределено Тогда
Элементы.ТЧ.ТекущаяСтрока = ТЧ[ТекущНомерСтрокиП-1].ПолучитьИдентификатор();
КонецЕсли;
ПоказатьИндексТекущейСтроки = 0;
Если Элементы.ТЧ.ТекущаяСтрока <> Неопределено Тогда
ИндексТекущейСтроки = ТЧ.Индекс(ТЧ.НайтиПоИдентификатору(Элементы.ТЧ.ТекущаяСтрока));
КонецЕсли;
ЗаполнитьТЧ();
Элементы.ТЧ.Обновить();
Если ИндексТекущейСтроки > 0 И ТЧ.Количество() > 1 Тогда
Если ИндексТекущейСтроки + 1 >= ТЧ.Количество() Тогда
ИндексТекущейСтроки = ТЧ.Количество() - 1;
КонецЕсли;
Элементы.ТЧ.ТекущаяСтрока = ТЧ.Получить(ИндексТекущейСтроки).ПолучитьИдентификатор();
КонецЕсли;
Показать