Autor |
Beitrag |
MrKnogge
      
Beiträge: 76
Win XP, Win 7
Delphi 7 Prof, Delphi 2005 PE, C# (VS 2008)
|
Verfasst: Sa 23.04.11 20:31
Hallo Zusammen,
gibt es unter C# die Möglichkeit, den aktuellen Eintrag eines ListViews nicht nur in der Standardfarbe zu markieren, sondern die Farbe selber zu bestimmen und den Eintrag zusätzlich zu umranden? (Beispiel siehe Anhang)
Weiter sollte diese Hervorhebung auch dann sichtbar sein, wenn das ListView gerade nicht den Fokus hat.
( Das ganze darf auch WPF / XAML sein )
Viele Grüße & besten Dank
Beispiel implementiert auf Basis von Mike Lischkes Virtual TreeView (png, 26.65 KB)
Einloggen, um Attachments anzusehen!
_________________ MfG MrKnogge
|
|
jaenicke
      
Beiträge: 19313
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 23.04.11 21:57
In der Dokumentation findest du sogar ein Beispiel:
msdn.microsoft.com/d...stview.drawitem.aspx
|
|
MrKnogge 
      
Beiträge: 76
Win XP, Win 7
Delphi 7 Prof, Delphi 2005 PE, C# (VS 2008)
|
Verfasst: Mo 25.04.11 10:57
Danke! Das Beispiel mit dem Farbverlauf funktioniert soweit wunderbar. Wenn ich dann aber meinen beschriebenen Ansatz umsetzen möchte, wird das Listview entweder nicht sauber neugezeichnet, oder ich bekomme die falschen Koordinaten.
Das Bild im Anhang beschreibt, was passiert wenn ich erst den dritten Eintrag, dann den zweiten und schließlich wieder den dritten markiere.
Im Folgenden der Codeschnipsel mit dem ich meine Umrandung zeichne, bzw. diese wieder entferne. Sieht jemand meinen Denkfehler?
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e) { if ((e.State & ListViewItemStates.Selected) != 0) { e.Graphics.FillRectangle(Brushes.White, e.Bounds);
Pen myPen = new Pen(Color.FromArgb(51, 153, 255)); myPen.Width = 2; e.Graphics.DrawRectangle(myPen, e.Bounds); e.DrawText(); } else { e.Graphics.FillRectangle(Brushes.White, e.Bounds);
Pen myPen = new Pen(Color.White); myPen.Width = 2; e.Graphics.DrawRectangle(myPen, e.Bounds); e.DrawText(); } } |
Viele Grüße & besten Dank!
Christian
_________________ MfG MrKnogge
|
|
jaenicke
      
Beiträge: 19313
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 25.04.11 15:05
MrKnogge hat folgendes geschrieben : | C#-Quelltext 1: 2: 3:
| Pen myPen = new Pen(Color.FromArgb(51, 153, 255)); myPen.Width = 2; e.Graphics.DrawRectangle(myPen, e.Bounds); | |
Du setzt die Breite des Stifts auf 2. Bounds geht aber bis zur untersten Kante. Daher zeichnest du über deinen Bereich hinaus.
Den Text solltest du wohl eher in DrawSubItem zeichnen, wie auch in der Doku steht.
Meinst du das ganze vielleicht so in der Art (das alles stammt fast 1:1 aus der Doku)?  1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92:
| private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e) { if ((e.State & ListViewItemStates.Selected) != 0) { Rectangle OuterRect = new Rectangle(e.Bounds.Left + 1, e.Bounds.Top + 1, e.Bounds.Width - 2, e.Bounds.Height - 2); e.Graphics.FillRectangle(Brushes.AliceBlue, e.Bounds); Pen OuterRectPen = new Pen(Color.Aqua, 2); e.Graphics.DrawRectangle(OuterRectPen, OuterRect); } else { e.Graphics.FillRectangle(Brushes.White, e.Bounds); } }
private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) { TextFormatFlags flags = TextFormatFlags.Left;
using (StringFormat sf = new StringFormat()) { switch (e.Header.TextAlign) { case HorizontalAlignment.Center: sf.Alignment = StringAlignment.Center; flags = TextFormatFlags.HorizontalCenter; break; case HorizontalAlignment.Right: sf.Alignment = StringAlignment.Far; flags = TextFormatFlags.Right; break; }
double subItemValue; if (e.ColumnIndex > 0 && Double.TryParse( e.SubItem.Text, NumberStyles.Currency, NumberFormatInfo.CurrentInfo, out subItemValue) && subItemValue < 0) { if ((e.ItemState & ListViewItemStates.Selected) == 0) { e.DrawBackground(); }
e.Graphics.DrawString(e.SubItem.Text, listView1.Font, Brushes.Red, e.Bounds, sf);
return; }
e.DrawText(flags); } }
private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) { using (StringFormat sf = new StringFormat()) { switch (e.Header.TextAlign) { case HorizontalAlignment.Center: sf.Alignment = StringAlignment.Center; break; case HorizontalAlignment.Right: sf.Alignment = StringAlignment.Far; break; }
e.DrawBackground();
using (Font headerFont = new Font("Helvetica", 8, FontStyle.Regular)) { e.Graphics.DrawString(e.Header.Text, headerFont, Brushes.Black, e.Bounds, sf); } } return; } |
|
|
MrKnogge 
      
Beiträge: 76
Win XP, Win 7
Delphi 7 Prof, Delphi 2005 PE, C# (VS 2008)
|
Verfasst: Mo 25.04.11 15:38
Danke! Verstehe jetzt auch wo mein Fehler lag. In der Doku muss ich es schlichtweg überlesen haben, da habe ich Subitem auf mehrere Spalten bezogen und beiseite gelassen
Nun läuft alles wunderbar.
_________________ MfG MrKnogge
|
|
|