2017-02-11 2 views
1

Im form1 KonstruktorWie kann ich listView ColumnHeader Textfarbe ändern?

listView1.Scrollable = true; 
      listView1.View = View.Details; 
      ColumnHeader header = new ColumnHeader(); 

      header.Text = "Files are ready"; 
      header.Name = "col1"; 
      listView1.Columns.Add(header); 
      listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); 
      listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); 

ich die Farbe „Dateien sind bereit“ zu Red ändern möchten. Also habe ich versucht, mit dieser Veranstaltung:

private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) 
     { 
      using (var sf = new StringFormat()) 
      { 
       sf.Alignment = StringAlignment.Center; 

       using (var headerFont = new Font("Microsoft Sans Serif", 9, FontStyle.Bold)) 
       { 
        e.Graphics.FillRectangle(Brushes.Pink, e.Bounds); 
        e.Graphics.DrawString(e.Header.Text, headerFont, 
         Brushes.Black, e.Bounds, sf); 
       } 
      } 
     } 

versucht, beiden Bürsten zu Rot zu ändern, aber es hat nichts zu ändern.

+1

Haben Sie setzen 'listView1.OwnerDraw = true;'? Ansonsten wird dieses Ereignis nicht ausgelöst. Haben Sie debugged, dass der Event-Handler tatsächlich aufgerufen wird? –

Antwort

1

Vermutlich haben Sie die OwnerDraw Eigenschaft Ihres listView1 zu true verfehlt.

Diese Eigenschaft gibt an, dass Sie Teile des ListView mit Ihrem eigenen Code anstelle der ursprünglichen ListView Methoden zeichnen möchten. Ohne es werden Ereignisse wie DrawColumnHeader, DrawItem und DrawSubItem nicht von der ListView ausgelöst werden.

Für die Spalten, die Sie nicht selbst zeichnen möchten, setzen Sie e.DrawDefault auf true. Und verwenden Sie e.DrawBackground() den Hintergrund des Headers zu ziehen, wenn Sie nur die Textfarbe ändern möchten:

private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) 
{ 
    if (e.ColumnIndex != myColumnIndex) 
    { 
     e.DrawDefault = true; // tell the ListView to draw this header 
     return; 
    } 

    e.DrawBackground(); 

    // draw your text as you did in your code 
    // except the FillRectangle since the background is 
    // now already drawn 
} 

Aber wenn Sie listView1.OwnerDraw zu true gesetzt haben, die ListView wird Sie fragen, für alles: die Header, die Artikel und die Unterpositionen. So müssen Sie DrawItem und DrawSubItem Ereignisse zu abonnieren, zu und sagen Sie dem ListView ausdrücklich, dass Sie es, diese Dinge selbst zeichnen wollen:

listView1.DrawItem += (sender, e) => { e.DrawDefault = true; }; 
listView1.DrawSubItem += (sender, e) => { e.DrawDefault = true; }; 
+0

Ich tat, wenn (e.ColumnIndex! = 0), da ich die var myColumnIndex nicht habe und ich habe nur eine Spalte, aber nicht sicher, ob es richtig ist. Zweitens habe ich den Zeichnungsteil nach dem e.DrawBackground() nicht verstanden; Ich verwende weiterhin meinen Code mit dem StringFormat, ohne die FillRectangle-Zeile zu verwenden. Aber ich sehe die Elemente in der ListView immer noch nicht. Es wird der Kopftext eingefärbt, aber ich sehe die Elemente nicht. –

+1

@mosheralf Ich habe die Zeile mit 'if (e.ColumnIndex! = ...' hinzugefügt, nur um zu zeigen, was zu tun ist _wenn Sie andere Spalten haben, können Sie sie weglassen, wenn Sie sie nicht brauchen. Für die Elemente, I ' ll update meine Antwort –

+1

@mosheralf updated. hoffe, dass es Ihre Probleme löst. btw: ja, mit Ihrem Code (ohne 'FillRectangle') nach' e.DrawBackground() 'ist genau das, was ich wollte, dass Sie tun :) –

Verwandte Themen