У меня небольшая проблема со списком.
Я могу загрузить его с элементами списка в порядке, но когда я устанавливаю цвет фона, он не рисует цвет полностью в левой части строки [ListViewItems загружаются с помощью ListViewSubItems для создания представления сетки, только первый столбец показывает ошибку]. Есть узкая полоска, которая не красится. Ширина этой полосы примерно такая же, как если бы у меня был заголовок строки.
Если у вас есть мысль о том, что можно сделать, чтобы нарисовать фон, я хотел бы это услышать.
Теперь, чтобы опробовать новую идею, я предлагаю награду в десять голосов за первое решение, в котором я все еще использую эту ужасную конструкцию беспорядка в виде псевдосетки. [Мне нравится устаревший код.]
Редактировать:
Вот образец, демонстрирующий проблему.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
ListView lv = new ListView();
lv.Dock = System.Windows.Forms.DockStyle.Fill;
lv.FullRowSelect = true;
lv.GridLines = true;
lv.HideSelection = false;
lv.Location = new System.Drawing.Point(0, 0);
lv.TabIndex = 0;
lv.View = System.Windows.Forms.View.Details;
lv.AllowColumnReorder = true;
this.Controls.Add(lv);
lv.MultiSelect = true;
ColumnHeader ch = new ColumnHeader();
ch.Name = "Foo";
ch.Text = "Foo";
ch.Width = 40;
ch.TextAlign = HorizontalAlignment.Left;
lv.Columns.Add(ch);
ColumnHeader ch2 = new ColumnHeader();
ch.Name = "Bar";
ch.Text = "Bar";
ch.Width = 40;
ch.TextAlign = HorizontalAlignment.Left;
lv.Columns.Add(ch2);
lv.BeginUpdate();
for (int i = 0; i < 3; i++)
{
ListViewItem lvi = new ListViewItem("1", "2");
lvi.BackColor = Color.Black;
lvi.ForeColor = Color.White;
lv.Items.Add(lvi);
}
lv.EndUpdate();
}
}





(До редактирования ...)
Я только что попытался установить BackColor в System.Windows.Forms.ListView, и цвет отлично применяется ко всему элементу управления (с изображениями и без них).
Вы вообще делаете какую-нибудь индивидуальную раскраску?
Ах! Я вижу сейчас :}
Вы хотите взломать? Представляю вам следующее:
...
lv.OwnerDraw = true;
lv.DrawItem += new DrawListViewItemEventHandler( lv_DrawItem );
...
void lv_DrawItem( object sender, DrawListViewItemEventArgs e )
{
Rectangle foo = e.Bounds;
foo.Offset( -10, 0 );
e.Graphics.FillRectangle( new SolidBrush( e.Item.BackColor ), foo );
e.DrawDefault = true;
}
Для более изобретательного и не менее хакерского подхода вы можете попробовать использовать фоновое изображение ListView;)
Я хочу элигант, но, конечно, могу согласиться на хакерство. Я попробую сегодня и посмотрю, работает ли это выглядит многообещающе.
Хакер, спасибо! Застрял со списком и .net 2.0 с новыми мировыми требованиями.
Хорошо, я добавляю дополнительные примечания к решению. Если вы используете решение выше, вам также необходимо вставить обработчик отрисовки для заголовков столбцов, иначе они не будут рисовать. Прямоугольник выбранного элемента также выглядит забавно, поэтому вы захотите проверить это в функции lv_DrawItem и реализовать аналогичное решение. Помните, что выделение выбирается на уровне системы, а не в вашем приложении.
Лучше ListView (и бесплатный Лучше ListView Express) позволяет установить фоновое изображение с различными настройками выравнивания (по центру, мозаичным, растянутым, подходящим, привязанным к границе / углу). Также поддерживается альфа-прозрачность:

Извините, я задал этот вопрос до того, как продезинфицировал код. Цвет применяется к фону ListViewItem, а не к ListView. Я выложу образец через секунду.