Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Сменить цвет выделенного элемента ListView. (http://forum.oszone.net/showthread.php?t=211485)

LilLoco 20-07-2011 00:03 1715978

Сменить цвет выделенного элемента ListView.
 
Доброе время суток. Собственно сабж, нужно сменить цвет выделяемого элемента в ListView. Подскажите как это сделать? Где можно посмотреть примеры...

Delirium 20-07-2011 02:29 1716031

Начнем с простого гугла :) http://www.google.ru/search?hl=ru&so...&aqi=&aql=&oq=
http://forums.asp.net/t/1297647.aspx
http://bytes.com/topic/visual-basic-...selected-color
http://ru.w3support.net/index.php?db=so&id=895309

LilLoco 20-07-2011 10:16 1716180

Забыл добавить что нужно для WinForms, моя ошибка :( По большинству ссылок либо Wpf, либо Asp.net :( Вроде как нужно использовать событие DrawItem, но все как то не могу с ним разобраться!

Delirium 22-07-2011 09:37 1717586

А вот это случайно не то, что надо? http://msdn.microsoft.com/ru-ru/libr...=vs.90%29.aspx

Ты хочешь изменить стандартный синенький текст при выделении строки или что конкретно? У меня не получается изменить только синий цвет выделения, все остальное меняется спокойно.

Еще маленько нарыл, но не тестировал:
http://www.debugging.com/bug/5554

LilLoco 22-07-2011 10:17 1717607

Цитата:

Цитата Delirium
Ты хочешь изменить стандартный синенький текст при выделении строки или что конкретно? »

Как раз - таки именно синенький цвет выделения)
Спасибо за ссылки, буду разбираться!

Delirium 25-07-2011 02:17 1719191

LilLoco, как вариант для обдумывания - проставить свойство OwnerDraw в True и руками прописать отображение. А в свойстве наведения мыши прорисовывать свой прямоугольник по координатам...

Delirium 29-07-2011 07:46 1722036

Решение найдено? Если да, поделись наработками :)

LilLoco 30-07-2011 23:16 1723021

Delirium, Я пока что в отпуске... Отдыхаю так сказать от всего) Как только закончится, так сразу примусь искать решение...

Delirium 31-07-2011 07:49 1723093

Похоже, я нашел то, что нужно. http://ru.w3support.net/index.php?db=so&id=1228492
Может помочь вот это: http://ru.w3support.net/index.php?db=so&id=1433292
А также http://stackoverflow.com/questions/1...ection-drawing
И напоследок http://stackoverflow.com/questions/2...rrect-location

LilLoco 16-08-2011 15:05 1733110

Delirium, Внимательно посмотрел все ваши ссылки, огромное спасибо.
Цитата:

Цитата Delirium
проставить свойство OwnerDraw в True и руками прописать отображени »

Именно так и сделал. Вот этого нужно было добиться :

Добился так :

Устанавливаем необходимые свойства
Код:

listView1.View = View.Tile;
listView1.OwnerDraw = true;
listView1.DrawItem += new DrawListViewItemEventHandler ( listView1_DrawItem );

Добавляем итемы в ListView
Код:

for (int i = 0; i < 5; i++)
{
    listView1.Items.Add("sdasdsdsf");
}

Сама перерисовка итемов
Код:

void listView1_DrawItem ( object sender, DrawListViewItemEventArgs e )
                {
                        if ((e.State & ListViewItemStates.Selected) != 0) //выделенный элемент
                        {
                                e.Graphics.FillRectangle (Brushes.Цвет, e.Bounds );
                                e.Graphics.DrawString ("Первая строка", new Font ( "Arial", 10 ), Brushes.Цвет, new Point ( e.Item.Position.X + 36, e.Item.Position.Y ) );
                                brush = new SolidBrush ( Color.FromArgb ( Colors.SecondRowSelected ) );
                                e.Graphics.DrawString ( "Вторая строка", new Font ( "Arial", 10 ), Brushes.Цвет, new Point ( e.Item.Position.X + 36, e.Item.Position.Y + 15 ) );
                        }
                        else //остальные элементы
                        {
                                e.Graphics.FillRectangle (Brushes.Цвет, e.Bounds );
                                e.Graphics.DrawString ("Первая строка", new Font ( "Arial", 10 ), Brushes.Цвет, new Point ( e.Item.Position.X + 36, e.Item.Position.Y ) );
                                brush = new SolidBrush ( Color.FromArgb ( Colors.SecondRowSelected ) );
                                e.Graphics.DrawString ( "Вторая строка", new Font ( "Arial", 10 ), Brushes.Цвет, new Point ( e.Item.Position.X + 36, e.Item.Position.Y + 15 ) );
                        }
                        e.Graphics.DrawImage (Image , e.Item.Position.X, e.Item.Position.Y + 2, 32, 32 );// отрисовываем иконку слева
                }

Вот таким способом добился.

Delirium 16-08-2011 18:48 1733274

Чудно, надо будет взять на заметку для своих проектов :)

LilLoco 17-08-2011 08:37 1733513

Немного поспешил закрыть тему :(

При методе, описанном выше, получается нечто ужасное. Все размывается, пропадает и так далее. Сразу не заметил( при малом количестве итемов). Словами тяжело объяснить, видео.

Есть ли идеи почему такое происходит?(

Delirium 17-08-2011 08:54 1733521

похоже, проблема из за того,что у тебя нигде не происходит вызов функции invalidate для списка.

LilLoco 17-08-2011 10:28 1733568

Цитата:

Цитата Delirium
вызов функции invalidate »

Если я правильно понял что нужно, сделал при добавлении итемов так :
Код:

listView1.BeginUpdate();
listView1.Items.Clear();
//Добавляю итемы
listView1.EndUpdate();
listView1.Invalidate();

Ничего не изменяется...

Решение "половины" проблемы найдено. Нужно при выборе областей прорисовки использовать вместо e.Item.Position, e.Bounds.

Отрисовывается вроде бы хорошо, пока что не заметил каких - либо нюансов. Но осталась еще одна половина проблемы - Есть элементы, фон белый, выделяю кликом один элемент(черный цвет). После этого тупо дергаю мышью по области listview, и проведя несколько раз курсором по выделенному элементу, цвет возвращается в белый, после чего выделить (черным) этот же элемент не получается кликом. Сначала нужно выделить другой.

LilLoco 17-08-2011 12:00 1733652

Кажется вторая половина проблемы тоже решена.
Просто добавить дополнительную проверку.

Код:

else //остальные элементы
                        {
                            if (!e.Item.Selected) //проверка не выделен ли элемент
                            {
                                e.Graphics.FillRectangle (Brushes.Цвет, e.Bounds );
                                e.Graphics.DrawString ("Первая строка", new Font ( "Arial", 10 ), Brushes.Цвет, new Point ( e.Item.Position.X + 36, e.Item.Position.Y ) );
                                brush = new SolidBrush ( Color.FromArgb ( Colors.SecondRowSelected ) );
                                e.Graphics.DrawString ( "Вторая строка", new Font ( "Arial", 10 ), Brushes.Цвет, new Point ( e.Item.Position.X + 36, e.Item.Position.Y + 15 ) );
                              }
                        }

На первый взгляд, все отрисовывается именно так, как хотелось бы. Время покажет)


Время: 12:06.

Время: 12:06.
© OSzone.net 2001-