Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
4 / 4 / 0
Регистрация: 21.04.2012
Сообщений: 132
1

Мерцает ListBox при добавлении записей - двойной буфер включен

05.12.2012, 12:38. Показов 3431. Ответов 6

Author24 — интернет-сервис помощи студентам
День добрый,

я вывожу строки в ListBox. Скорость вывода плавает. Максимум 100 раз в секунду. вот код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 // попробую добавить лист бокс вместо лист вью. работает
            list_box_tape = new ListBox();
 
            typeof(Control).GetProperty("DoubleBuffered", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty).SetValue(list_box_tape, true, null); // зададим свойства что бы не моргало для панели
 
            list_box_tape.DrawItem +=new DrawItemEventHandler(list_box_tape_DrawItem);
            list_box_tape.DrawMode = DrawMode.OwnerDrawVariable;
            
 
            form1_root.BeginInvoke(new Action(delegate() // без инвоука не выходит обратится к свойствам экрана. вылезает ошибка cross-thread
            {
                list_box_tape.Location = new Point(0 + 200, vkladhi_heidht); // высота от верхней границы tab_control. в этом месте будут располагаться вкладки
                list_box_tape.Width = (Screen.GetWorkingArea(form1_root).Width / 2) / 3 - 200;
                list_box_tape.Height = (Screen.GetWorkingArea(form1_root).Height / 2) - 90;
 
            })); // закрывающая для begin invoke
 
            list_box_tape.BringToFront();
            panel_2.Controls.Add(list_box_tape);
событие list_box_tape.DrawItem +=new DrawItemEventHandler(list_box_tape_DrawItem):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
   void list_box_tape_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) // событие добавления строчки в лист бокс(окно tape)
        {
            e.DrawBackground();
 
            Brush myBrush = Brushes.Black;
            Graphics g = e.Graphics;
            
            string text_box_msg = ((ListBox)sender).Items[e.Index].ToString();
            if (text_box_msg[0] == Convert.ToChar("B")) // в завистимости какая буква в строке, которую выводим в лист бокс - определяем цвет
            {
                g.FillRectangle(new SolidBrush(Color.Chartreuse), e.Bounds); // фон
            }
            else
            {
                g.FillRectangle(new SolidBrush(Color.Red), e.Bounds); // фон
            }
 
            g.DrawRectangle(new Pen(Color.White), e.Bounds); // рамка
 
            e.Graphics.DrawString(((ListBox)sender).Items[e.Index].ToString(), e.Font, myBrush, e.Bounds, StringFormat.GenericDefault);
            e.DrawFocusRectangle();
          
        }
все работает нормально, но при высокой скорости окно начинает мерцать, как панель, если не включен двойной буфер. как побороть глюк?

борис

Добавлено через 25 минут
черт! церцает. мде.. а, как исправить ошибку то?!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.12.2012, 12:38
Ответы с готовыми решениями:

ListBox мерцает при добавлении элементов
Есть некий listbox, который заполняется найденными файлами определенного типа. Поиск идет в...

Listbox "моргает" при добавлении большого количества записей
Добавляю много записей в лист по мере их поступления. сделал автопрокрутку таким образом:...

Проверка при добавлении в ListBox
Доброго времени суток, вот почти готова моя программа, над которой тружусь последние пару часов,...

Исключение повторов при добавлении в ListBox
Имеются два ListBox. В первом-список фамилий, второй изначально пустой. Нужно выбирать строку из...

6
179 / 179 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
05.12.2012, 13:19 2
А с чего вы взяли, что ListBox поддерживает DoubleBuffered? Если у него скрыто свойство, полагаю, это специально, чтобы его не меняли...
1
4 / 4 / 0
Регистрация: 21.04.2012
Сообщений: 132
05.12.2012, 13:50  [ТС] 3
ну, а делать то что? как побороть мерцалку?
0
179 / 179 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
05.12.2012, 19:06 4
Думаю, придется воспользоваться другим контролом - ListView, DataGridView или SourceGrid.
0
4 / 4 / 0
Регистрация: 21.04.2012
Сообщений: 132
06.12.2012, 11:40  [ТС] 5
то есть с ListBox - то, что хочу сделать, не получится?
0
179 / 179 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
06.12.2012, 11:49 6
Я не могу быть уверенным на 100%, но мне кажется, что если контрол не поддерживает двойной буфер, то мерцания не избежать. Во всяком случае, пока никто не предложил иного способа.
0
140 / 137 / 22
Регистрация: 16.02.2012
Сообщений: 453
06.12.2012, 12:56 7
Попробуйте включить двойной буфер через Reflection:

C#
1
listBox1.GetType().InvokeMember("DoubleBuffered", BindingFlags.SetProperty | BindingFlags.Instance | BindingFlags.NonPublic, null, listBox1, new object[] { true });
0
06.12.2012, 12:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2012, 12:56
Помогаю со студенческими работами здесь

Ошибка при добавлении записей в бд
Здравствуйте! Такая ситуация: есть private List<Education> List = new List<Education>(); там...

Ошибка при добавлении записей
Пытаюсь добавить записи в таблицу accsess но вылетает ошибка. Что не так? procedure...

Дублирование записей при добавлении
Здравствуйте! Столкнулся с проблемой Имеется форма "Добавление клиента" и запрос на добавление,...

Ошибки при добавлении записей в БД
Доброго времени суток, в моем проекте возникла ошибка добавления записи в бд. БД на Access, я...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru