2009-12-11 10 views

Odpowiedz

10

Sterowanie ListView nie obsługuje obrazów w podpunktach natywnie. Najłatwiejszą rzeczą jest przełączenie na DataGridView i użycie DataGridViewImageColumn. Jeśli nie jest to możliwe, musisz narysować ikony samodzielnie za pomocą niestandardowego wsparcia rysowania w formancie ListView. Aby to zrobić, należy ustawić ListView.OwnerDraw = true i obsługiwać zdarzenia ListView.DrawSubItem i ListView.DrawColumnHeader.

private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) 
{ 
    // Only interested in 2nd column. 
    if (e.Header != this.columnHeader2) 
    { 
     e.DrawDefault = true; 
     return; 
    } 

    e.DrawBackground(); 
    var imageRect = new Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Height, e.Bounds.Height); 
    e.Graphics.DrawImage(SystemIcons.Information.ToBitmap(), imageRect); 
} 

private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) 
{ 
    e.DrawDefault = true; 
} 
+0

dlaczego nie tylko 'var imageRect = e.Bounds;' Jest to typ wartości, więc wartości będą kopiowane i nieodwoływane, aby były bezpieczne w obsłudze. – ja72

+0

Ekspozycja, w realnym świecie, możesz dostosować imageRect, aby uwzględnić wyrównanie, dopełnienie i/lub dodatkową zawartość zawartą w podteście. –

2

Dziedziczenie z ListView i wyciągnąć własne ikony.

public class MyListView : ListView 
{ 
    protected override void OnDrawSubItem(System.Windows.Forms.DrawListViewSubItemEventArgs e) 
    { 
     base.OnDrawSubItem(e); 
    } 
} 
6

Zastosowanie P/Invoke i wysłać LVM_SETITEM wiadomość do ListView (należy ustawić styl LVS_EX_SUBITEMIMAGES na tworzenie sterowania lub poprzez LVM_SETEXTENDEDLISTVIEWSTYLE) określ indeks podpunkt i odpowiedni indeks obrazu. Będziesz musiał to zrobić dla każdego wstawianego elementu listy.

0

Ikona jest wyświetlana w kolumnie "pierwszy" i jest to również podstawa do wyszukiwania prefiksu klawiatury. Jednym z możliwych rozwiązań może być zmiana kolejności kolumn poprzez ustawienie DisplayIndex pierwszej kolumny na coś innego.

listView1.Columns[0].DisplayIndex = 1; 

To oczywiście działa tylko wtedy, gdy potrzebujesz ikony w jednej kolumnie.