Domanda

Ho un piccolo problema con una Listview.

Posso caricarlo correttamente con gli elementi listview, ma quando imposto il colore di sfondo non disegna il colore fino al lato sinistro della riga [Gli listViewItems vengono caricati con ListViewSubItems per creare una visualizzazione a griglia, solo la prima colonna mostra l'errore].C'è una striscia stretta che non dipinge.La larghezza di quella striscia è più o meno la stessa di un'intestazione di riga se avessi un'intestazione di riga.

Se hai un'idea su cosa si può fare per far risaltare lo sfondo, mi piacerebbe ascoltarla.

Ora, solo per provare una nuova idea, offro una ricompensa di dieci voti per la prima soluzione che mi fa ancora usare questo orribile costrutto di un pasticcio di visualizzazione pseudo-griglia.[Adoro il codice legacy.]

Modificare:

Ecco un esempio che presenta il 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();
    }
}
È stato utile?

Soluzione

Ah!Ora vedo :}

Vuoi un trucco?Vi presento quanto segue:

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

Per un approccio più creativo e non per questo meno complicato, potresti provare a utilizzare l'immagine di sfondo di ListView ;)

Altri suggerimenti

(Prima della modifica...)

Ho appena provato a impostare BackColor su System.Windows.Forms.ListView e il colore viene applicato correttamente sul controllo (con e senza immagini).

Stai eseguendo qualche verniciatura personalizzata?

Ok, sto aggiungendo alcune note aggiuntive sulla soluzione.Se usi la soluzione sopra devi anche inserire un gestore di disegno per le intestazioni delle colonne, altrimenti non verranno visualizzate.Anche il rettangolo dell'elemento selezionato sembra divertente, quindi ti consigliamo di verificarlo nella funzione lv_DrawItem e implementare una soluzione simile.Ricorda che l'evidenziazione viene scelta a livello di sistema e non nella tua applicazione.

Visualizzazione elenco migliore (e libero Migliore ListView Express) consente di impostare l'immagine di sfondo con varie impostazioni di allineamento (centrato, affiancato, allungato, adattato, agganciato al bordo/angolo).È supportata anche la trasparenza alfa:

enter image description here

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top