domenica 8 febbraio 2009

Personalizzare l'aspetto delle ColumHeader della ListView

Per personalizzare l'aspetto della ColumHeader sulla classe/controllo ListView è necessario (almeno per la mia soluzione) impostare la proprietà ListView.OwnerDraw a True.

 

Questa cosa (OwnerDraw a True) comporta la necessità di gestire appunto il disegno del controllo e dei suoi elementi.

E' necessario pertanto sottoscrivere e gestire due eventi entrambi legati alla ListView

  1. ListView.DrawColumnHeader
  2. ListView.DrawSubItem

Riservati rispettivamente al disegno della ColumHeader e del Subitem

Sottoscrizione evento:

C#
listView1.DrawColumnHeader += new DrawListViewColumnHeaderEventHandler(lv_DrawColumnHeader);

listView1.DrawSubItem += new DrawListViewSubItemEventHandler(lv_DrawSubItem);

VB.NET

AddHandler listView1.DrawColumnHeader, New DrawListViewColumnHeaderEventHandler(AddressOf lv_DrawColumnHeader)

AddHandler listView1.DrawSubItem, New DrawListViewSubItemEventHandler(AddressOf lv_DrawSubItem)

Nel gestore dell'evento si provvede al "Draw" dell'oggetto interessato.

C#

void lv_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)

{

       if ((e.ItemState & ListViewItemStates.Focused) > 0)

      {

           e.Graphics.FillRectangle(SystemBrushes.Highlight, e.Bounds);

           e.Graphics.DrawString(e.Item.SubItems[e.ColumnIndex].Text, listView1.Font, SystemBrushes.HighlightText, e.Bounds);

      }

      else

      {

             e.DrawBackground();

             e.DrawText();

      }

}

 

void lv_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)

{

      Brush brsh;

      switch (e.ColumnIndex) {

         case 0:

             brsh = Brushes.Gold;

             break;

         case 1:

             brsh = Brushes.AliceBlue;

             break;

         case 2:

             brsh = Brushes.YellowGreen;

             break;

         default:

             brsh = Brushes.Azure;

             break;

        }

        e.Graphics.FillRectangle(brsh, e.Bounds);

        e.DrawText();

 }  

Il progetto di esempio è stato realizzato con SharpDevelop, il progetto è comunque compatibile con qualsiasi versione di Visual Studio 2008, non facendo uso di classi e metodi introdotti con il Framework 3 non ci dovrebbero essere problemi anche con Visual Studio 2005.

Il progetto di esempio realizzato con VB.NET
Il progetto di esempio realizzato con C# 

Powerered with Window Live Writer

Nessun commento: