Pregunta

Tengo un pequeño problema con un Listview.

Puedo cargarlo bien con elementos de vista de lista, pero cuando configuro el color de fondo, no dibuja el color completamente hacia el lado izquierdo de la fila [Los elementos listViewItems se cargan con ListViewSubItems para crear una vista de cuadrícula, solo la primera columna muestra el error].Hay una franja estrecha que no pinta.El ancho de esa franja es aproximadamente el mismo que sería el encabezado de una fila si tuviera un encabezado de fila.

Si tienes alguna idea sobre lo que se puede hacer para dibujar el fondo, me encantaría escucharla.

Ahora, solo para probar una nueva idea, estoy ofreciendo una recompensa de diez votos por la primera solución que todavía me mantiene usando esta horrible construcción de una vista pseudocuadrícula desordenada.[Me encanta el código heredado.]

Editar:

Aquí hay un ejemplo que muestra el 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();
    }
}
¿Fue útil?

Solución

¡Ah!Ya lo veo :}

¿Quieres hacky?Les presento lo siguiente:

    ...
    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 un enfoque más inventivo, y no menos ingenioso, puedes intentar utilizar la imagen de fondo de ListView;)

Otros consejos

(Antes de la edición...)

Intenté configurar BackColor en System.Windows.Forms.ListView, y el color se aplica perfectamente en todo el control (con y sin imágenes).

¿Estás haciendo alguna pintura personalizada?

Ok, estoy agregando algunas notas de solución adicionales.Si utiliza la solución anterior, también deberá insertar un controlador de dibujo para los encabezados de las columnas; de lo contrario, no se pintarán.El rectángulo del elemento seleccionado también se ve raro, por lo que querrás verificarlo en la función lv_DrawItem e implementar una solución similar.Recuerde que el resaltado se elige a nivel del sistema y no en su aplicación.

Mejor vista de lista (y gratis Mejor ListView Express) permite configurar la imagen de fondo con varias configuraciones de alineación (centrada, en mosaico, estirada, ajustada, ajustada al borde/esquina).También se admite la transparencia alfa:

enter image description here

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top