Pergunta

Estou com um pequeno problema com um Listview.

Posso carregá-lo com itens de listview perfeitamente, mas quando defino a cor de fundo, ele não desenha a cor totalmente para o lado esquerdo da linha [Os listViewItems são carregados com ListViewSubItems para criar uma visualização em grade, apenas a primeira coluna mostra o erro].Há uma faixa estreita que não pinta.A largura dessa faixa é aproximadamente a mesma que seria um cabeçalho de linha se eu tivesse um cabeçalho de linha.

Se você tem alguma ideia sobre o que pode ser feito para desenhar o fundo, eu adoraria ouvir.

Agora, só para tentar uma nova ideia, estou oferecendo uma recompensa de dez votos para a primeira solução que ainda me faz usar essa construção horrível de uma visão de pseudo grade confusa.[Eu adoro código legado.]

Editar:

Aqui está um exemplo que mostra o problema.

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();
    }
}
Foi útil?

Solução

Ah!Eu vejo agora :}

Você quer hackear?Apresento a vocês o seguinte:

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

Para uma abordagem mais inventiva - e não menos hackeada -, você pode tentar utilizar a imagem de fundo do ListView;)

Outras dicas

(Antes da edição...)

Acabei de tentar definir BackColor em um System.Windows.Forms.ListView, e a cor é aplicada perfeitamente no controle (com e sem imagens).

Você está fazendo alguma pintura personalizada?

Ok, estou adicionando algumas notas de solução adicionais.Se você usar a solução acima, também precisará inserir um manipulador de desenho para os cabeçalhos das colunas, caso contrário, eles não serão pintados.O retângulo do item selecionado também parece engraçado, então você vai querer verificar isso na função lv_DrawItem e implementar uma solução semelhante.Lembre-se de que o destaque é escolhido no nível do sistema e não na sua aplicação.

Melhor ListView (e livre Melhor ListView Expresso) permite definir a imagem de fundo com várias configurações de alinhamento (centralizado, lado a lado, esticado, ajustar, ajustar à borda/canto).A transparência alfa também é suportada:

enter image description here

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top