Question

J'ai un petit problème avec une Listview.

Je peux bien le charger avec des éléments de liste, mais lorsque je définis la couleur d'arrière-plan, la couleur ne dessine pas complètement sur le côté gauche de la ligne [Les listViewItems sont chargés avec ListViewSubItems pour créer une vue en grille, uniquement la première colonne montre l'erreur].Il y a une bande étroite qui ne peint pas.La largeur de cette bande est à peu près la même que celle d'un en-tête de ligne si j'avais un en-tête de ligne.

Si vous avez une idée sur ce qui peut être fait pour dessiner l'arrière-plan, j'aimerais l'entendre.

Maintenant, juste pour essayer une nouvelle idée, j'offre une prime de dix voix pour la première solution qui me fait encore utiliser cette horrible construction d'un désordre de pseudo-vue en grille.[J'adore le code hérité.]

Modifier:

Voici un exemple qui présente le problème.

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();
    }
}
Était-ce utile?

La solution

Ah !Je vois maintenant :}

Tu veux du hacky ?Je vous présente ce qui suit :

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

Pour une approche plus inventive - et non moins hacky -, vous pouvez essayer d'utiliser l'image d'arrière-plan du ListView ;)

Autres conseils

(Avant l'édition...)

Je viens d'essayer de définir BackColor sur un System.Windows.Forms.ListView, et la couleur est très bien appliquée sur le contrôle (avec et sans images).

Faites-vous de la peinture personnalisée ?

Ok, j'ajoute quelques notes de solution supplémentaires.Si vous utilisez la solution ci-dessus, vous devez également insérer un gestionnaire de dessin pour les en-têtes de colonnes, sinon ils ne seront pas peints.Le rectangle de l'élément sélectionné a également l'air amusant, vous devrez donc le vérifier dans la fonction lv_DrawItem et implémenter une solution similaire.N'oubliez pas que la mise en évidence est choisie au niveau du système et non dans votre application.

Meilleure vue de liste (et libre Meilleur ListView Express) permet de définir l'image d'arrière-plan avec divers paramètres d'alignement (centré, carrelé, étiré, ajusté, aligné sur la bordure/le coin).La transparence alpha est également prise en charge :

enter image description here

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top