2008-09-13 8 views
3

Ich habe ein kleines Problem mit einem Listview.Listview Hintergrundzeichnung Problem C# Winform

Ich kann es mit ListView-Elemente in Ordnung, aber wenn ich die Hintergrundfarbe festlegen, zeichnet es nicht die Farbe ganz nach links der Zeile [Die ListViewItems werden mit ListViewSubItems geladen, um eine Rasteransicht zu erstellen, nur die erste Spalte zeigt den Fehler]. Es gibt einen schmalen Streifen, der nicht malt. Die Breite dieses Streifens ist ungefähr die gleiche wie eine Zeilenkopfzeile, wenn ich einen Zeilenkopf hätte.

Wenn Sie darüber nachdenken, was getan werden kann, um den Hintergrund zu zeichnen, würde ich es gerne hören.

Jetzt, nur um eine neue Idee zu versuchen, biete ich eine Zehn-Stimmen-Prämie für die erste Lösung an, die mich immer noch dieses schreckliche Konstrukt eines Chaos einer Pseudogitteransicht verwendet. [Ich liebe Legacy-Code.]

Edit:

Hier ist ein Beispiel, das das Problem zeigt.

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(); 
    } 
} 

Antwort

5

Ah! Ich sehe jetzt:}

Sie wollen Hacky? Ich präsentiere euch folgendes:

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

Für eine einfalls - und nicht weniger hacky - Ansatz, könnten Sie versuchen, das Hintergrundbild des Listview verwendet;)

+0

Ich möchte die Berechtigung haben, aber natürlich kann ich Hacky akzeptieren. Ich werde es heute versuchen und sehen, ob es funktioniert, das sieht wirklich vielversprechend aus. –

+0

Hacky ist es, danke! Stuck mit ListView und .net 2.0 mit neuen Weltanforderungen. – kyle

1

(Vor dem Bearbeiten ...)

ich gerade versucht habe auf einem System.Windows.Forms.ListView die Backcolor-Einstellung, und die Farbe wird über die Steuerung gerade fein aufgetragen (mit und ohne Bilder).

Machst du überhaupt ein Custom Painting?

+0

Leider habe ich diese Frage stellen, bevor ich Code hygienisiert hatte. Die Farbe wird auf den ListViewItem-Hintergrund und nicht auf die ListView angewendet. Ich werde eine Probe in einer Sekunde veröffentlichen. –

0

Ok Ich füge einige zusätzliche Lösung Anmerkungen. Wenn Sie die obige Lösung verwenden, müssen Sie auch einen Zeichenhandler für die Spaltenüberschriften einfügen, andernfalls werden sie nicht gezeichnet. Das ausgewählte Element-Rechteck sieht auch komisch aus, deshalb sollten Sie in der lv_DrawItem-Funktion danach suchen und eine ähnliche Lösung implementieren. Beachten Sie, dass die Hervorhebung auf Systemebene und nicht in Ihrer Anwendung ausgewählt wird.

0

Better ListView (und frei Better ListView Express) ermöglicht Einstellung Hintergrundbild mit verschiedenen Ausrichtungseinstellungen (zentriert, gekachelt, gestreckt, fit, Snap to Border/Ecke). Alpha-Transparenz wird ebenfalls unterstützt:

enter image description here