Forum: PC-Programmierung listView C#: Header Hintergrundfarbe ändern


von Entwickler (Gast)


Lesenswert?

Hallo,

für eine C# Anwendung wird ein listView Toolbox Element verwendet.
Nun möchte ich zum Abschluss noch, dass der Hintergrund des Headers
eine Farbe erhält. Leider konnte ich im Netz dazu nichts finden wo auch 
funktioniert hat.

von Dirk K. (merciless)


Lesenswert?

Erster Treffer bei Google-Suche nach
1
c# winforms listview header background
https://stackoverflow.com/questions/1814692/change-the-background-color-of-winform-listview-headers

merciless

von Entwickler (Gast)


Lesenswert?

Vielen Dank.

Das mit dem Ereignis "DrawColumnHeader" tut nicht. Es wird im debug Mode 
das Ereignis nicht ausgeführt.

von Adam P. (adamap)


Lesenswert?


von Entwickler (Gast)


Lesenswert?

Danke!

Funktioniert nun.

von Entwickler (Gast)


Lesenswert?

Jetzt ist es so dass die Hintergrundfarbe zwar ständig geändert wird 
aber solbald ich Daten in die items schreibe und im listView darstellen 
möchte, werden die Daten nicht angezeigt. Es scheint so, also ob die 
Callback Funktion permantent ausgeführt wird und das ganze listView neu 
zeichnet.

von Dirk K. (merciless)


Lesenswert?

Probier mal, das Update zu unterdrücken, wenn viele Items eingefügt 
werden:
1
private void SetWindowRedraw(Control ctrl, bool onOff)
2
{
3
  SendMessage(ctrl.Handle, WM_SETREDRAW, onOff, 0);
4
  if (onOff)
5
  {
6
    ctrl.Update();
7
  }
8
}
9
10
...
11
12
SetWindowRedraw(myListView, false);
13
myListView.Items.Clear();
14
// viele Items einfügen
15
...
16
SetWindowRedraw(myListView, true);

merciless

: Bearbeitet durch User
von Entwickler (Gast)


Lesenswert?

Moin Dirk, das funktioniert nicht. Schade.

von Zeno (Gast)


Lesenswert?

Entwickler schrieb:
> Moin Dirk, das funktioniert nicht. Schade.
Tja, C# hat eben so seine Ecken und Kanten. Da gibt es noch ganz andere 
Sachen wo man tricksen muß, damit er am Ende das macht was er machen 
soll.
Bin froh das ich mit dem Kram nix mehr machen muß.

von Entwickler (Gast)


Lesenswert?

Ja das stelle ich auch immer wieder fest.

Aber nochmal zu meinem Problem. Wie könnte ich dies umgehen, dass das 
trotzdem so funktioniert wie ich möchte?

von abc (Gast)


Lesenswert?

Im richtigen Forum nachfragen: https://mycsharp.de/
Sind sehr freundlich dort

von Zeno (Gast)


Lesenswert?

Entwickler schrieb:
> Aber nochmal zu meinem Problem. Wie könnte ich dies umgehen, dass das
> trotzdem so funktioniert wie ich möchte?

Muß es unbedingt ein ListView sein? Ginge evtl. auch ein Grid? Wenn die 
Linien stören dann diese halt ausblenden.
Dann gab's es doch so einen Header auch noch als selbständiges Object, 
da weiß ich aber nicht mehr wie das hieß - C# ist halt bei mir schon zu 
lang her.
Aber auch bei den Listen gab es unterschiedliche Objecte, die sich auch 
unterschiedlich verhalten haben. Probier mal eine Listbox.

von Zeno (Gast)


Lesenswert?

Machst Du Windows-Forms oder WPF?

von Entwickler (Gast)


Lesenswert?

Nix WPF nur WinForms

von Dirk K. (merciless)


Lesenswert?

Entwickler schrieb:
> Moin Dirk, das funktioniert nicht. Schade.

Ähm, was genau funktioniert nicht? Ich habe das hier
in mehreren Projekten so im Einsatz und da geht es?

merciless

von Entwickler (Gast)


Lesenswert?

Auf dem listView erscheint bei mir nichts mehr.
1
private void SetWindowRedraw(Control ctrl, bool onOff)
2
3
{
4
5
  SendMessage(ctrl.Handle, WM_SETREDRAW, onOff, 0);
6
7
  if (onOff)
8
9
  {
10
11
    ctrl.Update();
12
13
  }
14
15
}

Kannst du mir eventuell deine komplette Funktion posten mit den 
dazugehörigen
Variablen?

von Entwickler (Gast)


Lesenswert?

Guten Morgen, wenn ich die Funktion SetWindowRedraw ausführe erscheint 
dann nichts mehr auf dem lisView Toolboxelement.

von Entwickler (Gast)


Lesenswert?

Hier mein Beispiel das nicht funktioniert:
1
        public Program()
2
        {
3
            InitializeComponent();
4
5
            ListViewItem[] items = new ListViewItem[13];
6
7
            items [0] = new ListViewItem("Number");
8
            items [0].SubItems.Add("Test");
9
10
            SetWindowRedraw(listViewDefaultTelegram, 1);
11
            listViewTest.Items.Add(items [0]);
12
            SetWindowRedraw(listViewDefaultTelegram, 0);
13
        }
14
15
        private void OnDrawColumnHeader_listViewTest(object sender, DrawListViewColumnHeaderEventArgs e)
16
        {
17
            // Fill header background with solid yello color.
18
            e.Graphics.FillRectangle(Brushes.AliceBlue, e.Bounds);
19
            // Let ListView draw everything else.
20
            e.DrawText();
21
        }
22
23
        private void SetWindowRedraw(Control ctrl, int onOff)
24
        {
25
            int WM_SETREDRAW = 11;
26
            SendMessage(ctrl.Handle, WM_SETREDRAW, onOff, 0);
27
            if (onOff == 1)
28
            {
29
                ctrl.Update();
30
            }
31
        }

von Dirk K. (merciless)


Lesenswert?

Probiere mal
1
  SetWindowRedraw(listViewDefaultTelegram, 0);
2
  listViewTest.Items.Add(items [0]);
3
  SetWindowRedraw(listViewDefaultTelegram, 1);

merciless

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.