Доброго времени суток.
В процессе работы подписываюсь на событие контрола DataGridControl OnDblCick.
Срабатывает только тогда когда есть хоть одна запись в привязаном датасете...
При пустом или закрытом датасете событие игнорируется. Это я что-то не так делаю или так изначально задумано? ДаблКлик - то прописан для контрола.
Заранее спасибо за ответ.
Нравится
Добрый день, Юрий!
Да, действительно, компонент DataGrid позволяет обрабатывать события OnDblClick только если есть записи в связанном наборе данных. Эта логика реализована в ядре, и изменить ее средствами конфигурации не удается.
Основная причина, почему реализовали именно так - двойной клик используется чаще всего для редактирования записей, и если их нет, то и вызывать обработчик, видимо, не обязательно.
Надеюсь, Вам это сильно не помешает. Если все же мешает, то опишите задачу, возможно, найдется приемлемое решение.
Желаю успехов!
Дмитрий, спасибо за ответ.
В целом проблема выглядит так:
в процессе работы динамически собирается интерфейс окна. При этой сборке создаются такие "мини гриды" (это для полей множественного выбора).
Для добавления и удаления значение делаются две кнопки(рядом с гридом) "Добавить" и "Удалить"... но заказчик говорит, что это нагружает интерфейс и бла - бла..
Как вариант думал реализовать это так: на двойном клике вызывается wnd_MultiSelectData с текущем набором значений и уже в ней определяем нужные(добавляем, удаляем) значения. Может предложите какуи-то альтернативу ( использование PopUp меню заказчику не нравиться)
ЗЫ. и еще вопрос.. программно устанавливаю гриду IsFooterVisible = false, а Footer не пропадает :(
Заранее спасибо за ответ.
Варианты следующие:
1) датагрид + кнопка для показа MultiSelectData
2) датагрид + кнопка + горячая клавиша (Ctrl + I или другое сочетание)
3) датагрид (с одной незаметной служебной записью для осуществления DoubleClick) + обработчик OnDoubleClick
Если записей предполагается выбирать немного, то можно вообще использовать LookupControl, а текст выбранных значений через запятую отображать в Text контрола. Это означает не использовать датагрид вообще.
Выбор реализации также зависит от того, где будут сохраняться выбранные значения. Если в физической таблице, то подойдет способ №2, если в MemoryDataset, то и №3 подойдет.
Кстати, Popup меню вовсе не самый худший вариант - пользователь видит название действия, которое сможет выбрать, и совершает всего лишь один лишний клик мышью.
Насчет IsFooterVisible - проверил, на 3.2.0.33 все работает замечательно, Footer скрывается и появляется. Правда, для тестирования был выбран грид с DBDataset, на MemoryDataset не проверял.
Если возникнут вопросы, всегда рад помочь.
Спасибо за варианты, Дмитрий.
По поводу IsFooterVisible - у меня версия 3.2.2.2 и не пашет (на грид завязан DBDataset).
К теме еще такой вопрос:
Окно я получаю Services.GetNewItemByUSI()(насколько я понимаю создается целый СОМ-объект по результатм распарски xml, взятого из кеша или БД) и кладу на него контролы. Потом говорю окну Close, все тем же Services.GetNewItemByUSI() вызываю ето окно снова .. а контролы, созданые ранее, остались. Пока решение етой проблемы реализовано так : на OnClose() окна убиваю все созданные контролы через RemoveComponent. Но прорисовка этого действия пугает даже меня!, не говоря уже про заказчика.
Вопрос таков: как можно полностью убить объект? я так понимаю тут проблема в профильной сюреализации, но свойство UseProfile(если вообще оно за это отвечает) стоит false.
Заранее спасибо за помощь.
Добрый день, Юрий!
Если у Вас действительно версия 3.2.2.x - рекомендую сохранить все наработки в xml и работать на версии 3.2.1.x. Версия 3.2.2.x, насколько мне известно, широкой публике представлена не была и ее разработка и поддержка не осуществляется. Вместо нее создается новая версия 3.3.0 (еще не вышла, находится в разработке).
Странно, откуда у Вас версия 3.2.2.2 ?
Насчет IsFooterVisible больше комментариев нет. Проверил на 3.2.1.14 - работает. Если перейдете на 3.2.1.x и на ней работать не будет, значит, причина в конфигурации, а не в ядре.
Метод Services.GetNewItemByUSI() создает абсолютно новый экземпляр сервиса на основе XML, считанного из БД. Если в процессе модификации экземпляра сервиса Вы не сохраняли его в БД, то ситуации, когда при создании нового экземпляра в нем УЖЕ будут какие-либо посторонние элементы, быть не должно. Если это наблюдается на версии 3.2.1.x, то требуется подробное описание Ваших действий и скриншот результата, будем разбираться что именно сделано не так.
Проверьте, что используется именно указанная функция. Дело в том, что есть еще функция Services.GetSingleItemByUSI(), результат выполнения которой очень похож на описанный Вами. Функция возвращает ссылку на объект, сгенерированный ранее, и этот объект мог быть модифицирован Вами ранее в режиме выполнения.
Всегда рад Вам помочь.