Доброго времени суток!
Имеется следующая проблема (Windows Forms, C# 2008). На форме расположен TabControl, в котором есть несколько вкладок (TabPage).
На каждой вкладке располагаются текстовые поля, которые связаны с источником данных.
Реализуется следующий механизм- перед сохранением данных осуществить валидацию, и выдать те поля, которые заполнены некорректно. Поля, подлежащие валидации располагаются на нескольких вкладках.
Проблема заключается в том, что если не активировать вкладку — то связывания элементов на соответствующей вкладке не происходит, и соответственно поле остается пустым (свойство Text пустое) – и пользователю отображается, что это поле не заполнено. Если же перейти – на вкладку – то связывание происходит
Пока используется обходной путь – перед валидацией последовательно активируем все вкладки:
int currentIndex = tabControl.SelectedIndex;
for (int i = 0; i < tabControl.TabCount; i++)
if (i != currentIndex)
tabControl.SelectedIndex = i;
// и снова выбираем первоначальную вкладку
tabControl.SelectedIndex = currentIndex;
Недостаток этого метода состоит в мерцании элемента управления, и что это все происходит на глазах у пользователя
Вопрос:
— как можно реализовать DataBinding, чтобы он связывал данные во всех TabPages сразу же при загрузке форме?
— если так сделать нельзя, то как можно сделать, чтобы переключение вкладок осуществлялось без моргания (по аналогии с
listView.BeginUpdate ()
и
EndUpdate ())
Буду рад любым ссылкам, комментариям
MSDN пишет:
Элементы управления, содержащиеся в объекте TabPage, не создаются до тех пор, пока не будет показана страница вкладки, и любые привязки данных в этих элементах управления не активизируются, пока не будет показана страница вкладки.
Можно при создании TabControla загружать значения в текстбоксы вручную, а уже потом делать привязку к источникам. Унаследовать от TabControl и конструкторе это проделать.
Здравствуйте, out-of-the-way, Вы писали:
OOT>Можно при создании TabControla загружать значения в текстбоксы вручную, а уже потом делать привязку к источникам. Унаследовать от TabControl и конструкторе это проделать.
Можно пример кода, т.к. даже выполнение вышеуказанного кода
int currentIndex = tabControl.SelectedIndex;
for (int i = 0; i < tabControl.TabCount; i++)
if (i != currentIndex)
tabControl.SelectedIndex = i;
// и снова выбираем первоначальную вкладку
tabControl.SelectedIndex = currentIndex;
до отображения формы не дает требуемого эффекта по связыванию данных
Здравствуйте, Кирилл Барышников, Вы писали:
КБ>Здравствуйте, out-of-the-way, Вы писали:
OOT>>Можно при создании TabControla загружать значения в текстбоксы вручную, а уже потом делать привязку к источникам. Унаследовать от TabControl и конструкторе это проделать.
КБ>Можно пример кода, т.к. даже выполнение вышеуказанного кода
КБ>КБ> int currentIndex = tabControl.SelectedIndex;
КБ> for (int i = 0; i < tabControl.TabCount; i++)
КБ> if (i != currentIndex)
КБ> tabControl.SelectedIndex = i;
КБ> // и снова выбираем первоначальную вкладку
КБ> tabControl.SelectedIndex = currentIndex;
КБ>
КБ>до отображения формы не дает требуемого эффекта по связыванию данных
Принцип я уже вам сказал: загружаем значения в текстбоксы вручную, а потом подключаем привязки к данным.
Вы можете это сделать в своём цикле. Во вторых: если вы отображаете какие ни будь данные, то они уже должны быть корректными,а проверку делать после их редактирования. Используйте событие TextBox.Validating, оно будет вызываться только если текст в textBox был изменён и не надо будет беспокоится о не показанных вкладках.