Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
94 / 94 / 36
Регистрация: 01.10.2014
Сообщений: 229

Показать форму только тогда, когда закончилась прорисовка всех элементов управления

01.04.2015, 15:06. Показов 3513. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Вопрос по Windows Forms.
На форме есть много комбобоксов, текстбоксов и кнопок.
После выполнения определенной функции они начинают заполняться.
На форме прорисовка этих элементов происходит поочереди, что выглядит не красиво.
Хочу перед выполнением функции форму скрывать(или картинку ожидания показывать), а когда прорисуются все элементы, тогда всё разом показать.

Подскажите, есть ли какая-нибудь функция или событие об окончании прорисовки элемента?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.04.2015, 15:06
Ответы с готовыми решениями:

Определите предикат p(+U, +V, ?L) - истинный тогда и только тогда, когда L - список всех элементов, содержащихся либо в списке U, либо в списке V.
Здравствуйте, помогите пожалуйста решить задачу. Заранее благодарна) Определите предикат p(+U, +V, ?L) - истинный тогда и только...

Выдать Yes тогда и только тогда, когда X и Y являются соседними элементами в списке S
Доброго времени суток. Я тут как и большинство, студент. Функциональное осилил, логическое — мозг не поворачивается. Есть задание: ...

Предикат range(?M, ?N, ?L), истинный тогда и только тогда, когда L - список целых чисел
Доброго времени суток. Помогите, пожалуйста со следующей задачей: Напишите предикат range(?M, ?N, ?L), истинный тогда и только тогда,...

19
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
01.04.2015, 16:32
Попробуйте включить двойную буффиризацию.
C#
1
2
 // Двойная буф-я
            typeof(Control).GetProperty("DoubleBuffered", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.SetProperty).SetValue(pictureBox_map, true, null);
Добавлено через 1 минуту
К стати у формы помоему даже в свойствах задать можно. Если не поможет - будем думать.
1
94 / 94 / 36
Регистрация: 01.10.2014
Сообщений: 229
01.04.2015, 16:38  [ТС]
Пробовал двойную буферизацию - всё равно, всё одно за другим отображается...
Совсем голову сломал...
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
01.04.2015, 16:46
Ясно. Тогда не в отрисовке дело. Значит нужно дождаться пока у вас все необходимые контролы создадутся и заполнятся , а за тем их вывести на форму. Ну типа запустили метод который создает и заполняет ваши контролы , но на форму их не выводим как вариант (visible = false), а как только метод отработал всем своим новоиспеченным и обновленным контролам делаем visble = true. Подойдет такой выриант?

Добавлено через 1 минуту
Стоп или они не создаются а только перерисовываются?

Добавлено через 1 минуту
Проект можно глянуть?
0
94 / 94 / 36
Регистрация: 01.10.2014
Сообщений: 229
01.04.2015, 16:51  [ТС]
Они только перерисовываются. Контролы создаются 1 раз. С visible делал. После окончания метода ставил визибл в трю и они начинают поочереди рисоваться на форме.

Добавлено через 2 минуты
проект большой - это БД. Программа будет работать только из ЛВС нашей компании. Подключение к БД и т.д.
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
01.04.2015, 16:55
Видимо у вас сам метод (или методы) сборки информации , которая выводится в контролы медленно работает. Тогда можно дождаться пока собирем всю инфу для отображения в контролах, собирая её например в List , а как только сбор инфы закончен вывести все в нужные контролы. Может так?
1
94 / 94 / 36
Регистрация: 01.10.2014
Сообщений: 229
01.04.2015, 17:03  [ТС]
Идея хорошая ))) правда код увеличится... Думаю, если других вариантов нет - так и сделаю.
Заметил такой момент:
У меня эти контролы находятся в элементе panel1. Соответственно когда элементы постепенно прорисовываются, тогда и запускается каждый раз событие Paint. Можно ли как то отловить последний вызов события Paint? Тогда я пойму когда все контролы появились.
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
01.04.2015, 17:09
Это про событие https://msdn.microsoft.com/ru-... .110).aspx
засунте туда переменную счетчик и обнуляете ее при каждом запуске вашего (назавемего) медленного метода. Только великого смысла я в этом не вижу. Не легчели по окончанию работы медленного метода генерить событие его окончания?
0
94 / 94 / 36
Регистрация: 01.10.2014
Сообщений: 229
01.04.2015, 17:17  [ТС]
Я по окончании этого долгого метода ставлю визибл трю этой панели и начинается постепенная прорисовка контролов в ней. Вообще не соображаю почему они сразу не появляются... Думаю в коде где то напортачил...Буду капать...
Спасибо за помощь )))
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
01.04.2015, 17:27
Странно. Ну ладно пишите если что. Сам когдата с таким мучалчя чуть не расплакался , а оказалось всё просто. К стати вы там БД упамянули может приее чтении тормозить 90%.
0
94 / 94 / 36
Регистрация: 01.10.2014
Сообщений: 229
01.04.2015, 17:30  [ТС]
Да нет - там данные до метода уже прочитаны и в DataTable находятся. Оттуда и беру. Эх... всю башку сломал...
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
01.04.2015, 17:32
Хммм ... не так тяжко -только смотреть.
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18261 / 14186 / 5366
Регистрация: 17.03.2014
Сообщений: 28,871
Записей в блоге: 1
01.04.2015, 17:52
SailarmoonKS, если у контрола есть методы BeginUpdate/EndUpdate, то следует пользоваться ими.
0
117 / 118 / 52
Регистрация: 19.12.2014
Сообщений: 612
01.04.2015, 21:14
SailarmoonKS, а если создать вторую форму которая будет выпадать на ней будет прогресс бар, а прошлая форма будет недоступна, пока не закроется вторая. Вторая по завершению прогресс бара, закроется.
1
94 / 94 / 36
Регистрация: 01.10.2014
Сообщений: 229
07.04.2015, 14:07  [ТС]
lokilo, хотелось бы не использовать заставку. Это в том случае буду делать, если совсем ничего не придумать.

OwenGlendower, а можно поподробнее что это за волшебные методы?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18261 / 14186 / 5366
Регистрация: 17.03.2014
Сообщений: 28,871
Записей в блоге: 1
07.04.2015, 14:19
SailarmoonKS, метод BeginUpdate блокирует перерисовку элемента управления до момента вызова EndUpdate.
1
94 / 94 / 36
Регистрация: 01.10.2014
Сообщений: 229
09.04.2015, 09:09  [ТС]
Спасибо за подсказки, попробую прикрутить этот метод )))
0
0 / 0 / 0
Регистрация: 08.05.2015
Сообщений: 7
08.05.2015, 06:52
SailarmoonKS Привет!

Проблему решил?
У меня такая же ситуация.
Помоги с ответом!
0
94 / 94 / 36
Регистрация: 01.10.2014
Сообщений: 229
14.05.2015, 08:28  [ТС]
В принципе более менее помогла двойная буферизация - чуток ускорила проявление контролов на форме. Но всё равно заметно как они по очереди появляются. Оставил как есть. Не критично, но просто глаза мозолит. Посмотри у себя в коде места, где формируются коллекции элементов (комбобоксы, листбоксы, тривью и т.д.) - попробуй сделать их заполнение попроще(чтобы меньше времени занимали). Поменьше мест, где у тебя визибл то в трю, то в фолсе переходят. Если заполнение совсем долго, то выводи какую нибудь заставку. У меня заставка в другой форме сделана и запускается не как дочернее окно, а как application - так удобнее. Одна заставка на любые долгие операции.

Вот код про двойную буферизацию:

#region Двойной буфер

void SetDoubleBuffered(Control c, bool value)
{
PropertyInfo pi = typeof(Control).GetProperty("DoubleBuffe red", BindingFlags.SetProperty | BindingFlags.Instance | BindingFlags.NonPublic);
if (pi != null)
{
pi.SetValue(c, value, null);

MethodInfo mi = typeof(Control).GetMethod("SetStyle", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.NonPublic);
if (mi != null)
{
mi.Invoke(c, new object[] { ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true });
}

mi = typeof(Control).GetMethod("UpdateStyles" , BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.NonPublic);
if (mi != null)
{
mi.Invoke(c, null);
}
}
}
#endregion


А В самом коде, например для датагрид

SetDoubleBuffered(datagridview1, true);


В

Добавлено через 1 минуту
увлекаться с двойной буферизацией тоже не стоит. Общий процесс загрузки программы начинает тормозится - причем довольно мощно. Я все свои контролы на панели разместил и применил буферизацию для панели
1
0 / 0 / 0
Регистрация: 08.05.2015
Сообщений: 7
14.05.2015, 09:10
Спасибо огромное!
Буду пробовать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.05.2015, 09:10
Помогаю со студенческими работами здесь

Теорема Последовательность {xn : n ∈N} сходится тогда и только тогда, когда она ограничена и имеет единственный частичный предел
Теорема. Последовательность {xn : n ∈N} сходится тогда и только тогда, когда она ограничена и имеет единственный частичный предел. ...

Массив: Построить массив из нулей и единиц, в которой bi = 1 тогда и только тогда, когда в i-ой строке матрицы есть хотя бы отрицательный элемент
Даны натуральное число n, действительная квадратная матрица порядка n. Построить последовательность b1, b2, …, bn из нулей и единиц, в...

Доказать, что A · B = {ab | a ∈ A, b ∈ B} — это подгруппа в G тогда и только тогда, когда A · B = B · A
Пусть G — группа, A,B — подгруппы в G. Доказать, что A · B = {ab | a ∈ A, b ∈ B} — это подгруппа в G тогда и только тогда, когда A · B =...

Число делится на 3 тогда и только тогда, когда сумма его цифр делится на 3
Помогите с решением задачи: Как известно, число делится на 3 тогда и только тогда, когда сумма его цифр делится на 3. Проверить этот...

Известно, что число делится на три тогда и только тогда, когда сумма его цифр делится на три. Проверим этот признак для заданного трехзначного числа X
Известно, что число делится на три тогда и только тогда, когда сумма его цифр делится на три. Проверим этот признак для заданного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru