Показать полную графическую версию : [решено] Сменить цвет выделенного элемента ListView.
Доброе время суток. Собственно сабж, нужно сменить цвет выделяемого элемента в ListView. Подскажите как это сделать? Где можно посмотреть примеры...
Delirium
20-07-2011, 02:29
Начнем с простого гугла :) http://www.google.ru/search?hl=ru&source=hp&biw=1600&bih=796&q=C%23+ListView+change+selected+row+color&aq=f&aqi=&aql=&oq=
http://forums.asp.net/t/1297647.aspx
http://bytes.com/topic/visual-basic-net/answers/708870-listview-change-row-color-selected-color
http://ru.w3support.net/index.php?db=so&id=895309
Забыл добавить что нужно для WinForms, моя ошибка :( По большинству ссылок либо Wpf, либо Asp.net :( Вроде как нужно использовать событие DrawItem, но все как то не могу с ним разобраться!
Delirium
22-07-2011, 09:37
А вот это случайно не то, что надо? http://msdn.microsoft.com/ru-ru/library/ms771517%28v=vs.90%29.aspx
Ты хочешь изменить стандартный синенький текст при выделении строки или что конкретно? У меня не получается изменить только синий цвет выделения, все остальное меняется спокойно.
Еще маленько нарыл, но не тестировал:
http://www.debugging.com/bug/5554
Ты хочешь изменить стандартный синенький текст при выделении строки или что конкретно? »
Как раз - таки именно синенький цвет выделения)
Спасибо за ссылки, буду разбираться!
Delirium
25-07-2011, 02:17
LilLoco, как вариант для обдумывания - проставить свойство OwnerDraw в True и руками прописать отображение. А в свойстве наведения мыши прорисовывать свой прямоугольник по координатам...
Delirium
29-07-2011, 07:46
Решение найдено? Если да, поделись наработками :)
Delirium, Я пока что в отпуске... Отдыхаю так сказать от всего) Как только закончится, так сразу примусь искать решение...
Delirium
31-07-2011, 07:49
Похоже, я нашел то, что нужно. http://ru.w3support.net/index.php?db=so&id=1228492
Может помочь вот это: http://ru.w3support.net/index.php?db=so&id=1433292
А также http://stackoverflow.com/questions/1228492/winforms-listview-selection-drawing
И напоследок http://stackoverflow.com/questions/2516967/how-to-draw-a-rectangle-in-winform-app-in-the-correct-location
Delirium, Внимательно посмотрел все ваши ссылки, огромное спасибо.
проставить свойство OwnerDraw в True и руками прописать отображени »
Именно так и сделал. Вот этого нужно было добиться :
http://i002.radikal.ru/1108/c5/ffe85963b4d7.jpg
Добился так :
Устанавливаем необходимые свойства
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
Чудно, надо будет взять на заметку для своих проектов :)
Немного поспешил закрыть тему :(
При методе, описанном выше, получается нечто ужасное. Все размывается, пропадает и так далее. Сразу не заметил( при малом количестве итемов). Словами тяжело объяснить, видео (http://www.youtube.com/watch?v=jdyQo-hSKnQ).
Есть ли идеи почему такое происходит?(
Delirium
17-08-2011, 08:54
похоже, проблема из за того,что у тебя нигде не происходит вызов функции invalidate для списка.
вызов функции invalidate »
Если я правильно понял что нужно, сделал при добавлении итемов так :
listView1.BeginUpdate();
listView1.Items.Clear();
//Добавляю итемы
listView1.EndUpdate();
listView1.Invalidate();
Ничего не изменяется...
Решение "половины" проблемы найдено. Нужно при выборе областей прорисовки использовать вместо e.Item.Position, e.Bounds.
Отрисовывается вроде бы хорошо, пока что не заметил каких - либо нюансов. Но осталась еще одна половина проблемы - Есть элементы, фон белый, выделяю кликом один элемент(черный цвет). После этого тупо дергаю мышью по области listview, и проведя несколько раз курсором по выделенному элементу, цвет возвращается в белый, после чего выделить (черным) этот же элемент не получается кликом. Сначала нужно выделить другой.
Кажется вторая половина проблемы тоже решена.
Просто добавить дополнительную проверку.
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 ) );
}
}
На первый взгляд, все отрисовывается именно так, как хотелось бы. Время покажет)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.