Задача рисования фона ListView C # Winform - PullRequest
3 голосов
/ 13 сентября 2008

У меня небольшая проблема с Listview.

Я могу нормально загрузить его с элементами списка, но когда я устанавливаю цвет фона, он не рисует цвет полностью до левой части строки первый столбец показывает ошибку]. Есть узкая полоска, которая не красит. Ширина этой полосы примерно равна ширине строки, если бы у меня был заголовок строки.

Если у вас есть мысли о том, что можно сделать, чтобы нарисовать фон, я бы с удовольствием это услышал.

Теперь, чтобы попробовать новую идею, я предлагаю вознаграждение в десять голосов за первое решение, в котором я до сих пор использую эту ужасную конструкцию, состоящую из беспорядка в виде псевдосетки. [Я люблю устаревший код.]

Edit:

Вот пример, демонстрирующий проблему.

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();
    }
}

Ответы [ 4 ]

5 голосов
/ 13 сентября 2008

Ах! Теперь я вижу:}

Хочешь хаки? Я представляю вам следующее:

    ...
    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;)

1 голос
/ 13 сентября 2008

(до редактирования ...)

Я только что попытался установить BackColor для System.Windows.Forms.ListView, и цвет применяется к элементу управления очень хорошо (с изображениями и без).

Ты вообще занимаешься рисованием?

0 голосов
/ 23 апреля 2014

Лучше ListView (и бесплатно Лучше ListView Express ) позволяет устанавливать фоновое изображение с различными настройками выравнивания (по центру, мозаикой, растяжением, подгонкой, привязкой к границе / углу). Также поддерживается альфа-прозрачность:

enter image description here

0 голосов
/ 17 сентября 2008

Хорошо, я добавляю несколько дополнительных примечаний к решению. Если вы используете вышеуказанное решение, вам также нужно вставить обработчик рисования для заголовков столбцов, иначе они не будут рисовать. Прямоугольник выделенного элемента также выглядит забавно, поэтому вы должны проверить это в функции lv_DrawItem и реализовать аналогичное решение. Помните, что подсветка выбирается на системном уровне, а не в вашем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...