Autor Beitrag
MrKnogge
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 76

Win XP, Win 7
Delphi 7 Prof, Delphi 2005 PE, C# (VS 2008)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 23.04.11 21:57 
In der Dokumentation findest du sogar ein Beispiel:
msdn.microsoft.com/d...stview.drawitem.aspx
MrKnogge Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 76

Win XP, Win 7
Delphi 7 Prof, Delphi 2005 PE, C# (VS 2008)
BeitragVerfasst: 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?

ausblenden 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(51153255));
                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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 25.04.11 15:05 
user profile iconMrKnogge hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden C#-Quelltext
1:
2:
3:
                Pen myPen = new Pen(Color.FromArgb(51153255));
                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)? ;-)
ausblenden volle Höhe C#-Quelltext
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())
            {
                // Store the column text alignment, letting it default
                // to Left if it has not been set to Center or Right.
                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;
                }

                // Draw the text and background for a subitem with a 
                // negative value. 
                double subItemValue;
                if (e.ColumnIndex > 0 && Double.TryParse(
                    e.SubItem.Text, NumberStyles.Currency,
                    NumberFormatInfo.CurrentInfo, out subItemValue) &&
                    subItemValue < 0)
                {
                    // Unless the item is selected, draw the standard 
                    // background to make it stand out from the gradient.
                    if ((e.ItemState & ListViewItemStates.Selected) == 0)
                    {
                        e.DrawBackground();
                    }

                    // Draw the subitem text in red to highlight it. 
                    e.Graphics.DrawString(e.SubItem.Text,
                        listView1.Font, Brushes.Red, e.Bounds, sf);

                    return;
                }

                // Draw normal text for a subitem with a nonnegative 
                // or nonnumerical value.
                e.DrawText(flags);
            }
        }

        private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
        {
            using (StringFormat sf = new StringFormat())
            {
                // Store the column text alignment, letting it default
                // to Left if it has not been set to Center or Right.
                switch (e.Header.TextAlign)
                {
                    case HorizontalAlignment.Center:
                        sf.Alignment = StringAlignment.Center;
                        break;
                    case HorizontalAlignment.Right:
                        sf.Alignment = StringAlignment.Far;
                        break;
                }

                // Draw the standard header background.
                e.DrawBackground();

                // Draw the header text.
                using (Font headerFont =
                            new Font("Helvetica"8, FontStyle.Regular))
                {
                    e.Graphics.DrawString(e.Header.Text, headerFont,
                        Brushes.Black, e.Bounds, sf);
                }
            }
            return;
        }
MrKnogge Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 76

Win XP, Win 7
Delphi 7 Prof, Delphi 2005 PE, C# (VS 2008)
BeitragVerfasst: 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 :oops:

Nun läuft alles wunderbar.

_________________
MfG MrKnogge