Autor Beitrag
Steffen124
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 14.02.12 20:17 
Hi,

ich stelle Daten die ich in einer Liste (aus Objekten) habe in einem DataGridView dar.
Bei den einzelnen Datensätzen (Zeilen) handelt es sich um Aufträge die verschiedene Stati haben können.
Diese Stati möchte ich durch farbigen Zellenhintergrund darstellen: Noch nicht ausgeführter Auftrag=>rot, ausgeführter Auftrag=>grün, stornierter Auftrag=>grau.

So weit, so gut. Nun muss ich natürlich auch noch die gerade aktuelle Zeile irgendwie hervorheben. Default hat die wohl beim dataGridView einen blauen Hintergrund.
Da ich aber die Hintergrundfarbe für o.g. Stati schon "verbraucht" haben suche ich nach einer anderen Möglichkeit.

Wie kann man dem dgv beibringen, dass die aktuelle Zeile nicht mit farbigen Hintergrund sondern z.B. durch fette Schriftart hervor gehoben wird?

MfG
Steffen
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 14.02.12 20:44 
Hallo Steffen :welcome:

mittels der verschiedenen Stile (Styles) kann das DGV optisch angepasst werden: DefaultCellStyle, RowsDefaultCellStyle etc.

Dort gibt es dann die beiden Eigenschaften SelectionBackColor und SelectionForeColor - du könntest diese mal auf Colors.Transparent setzen.

Um die aktuelle Zeile immer in Fettschrift darzustellen, wirst du die einzelnen Zellen selber zeichnen müssen (bzw. zeichnen lassen): CellPainting-Ereignis und dort dann die aktuell zu zeichnende Zeile (e.RowIndex) mit der(n) aktuell selektierten Zeile(n) (SelectedRows) vergleichen müssen bzw. den e.State auswerten (ich nehme mal an, dein SelectionMode steht auf FullRowSelect).

In DataGridViewFAQ.doc stehen viele weitere hilfreiche Tipps zum Umgang mit dem DGV.
Steffen124 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 15.02.12 08:00 
Hi,

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:

...DefaultCellStyle, RowsDefaultCellStyle etc.
..die beiden Eigenschaften SelectionBackColor und SelectionForeColor - du könntest diese mal auf Colors.Transparent setzen.


Danke! das klappt.
Aber das Fettzeichnen im CellPainting-Ereignis bekomme ich nicht hin.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
        private void dataGridView2_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            DataGridView dgv = sender as DataGridView;
            if (dgv.CurrentCell.RowIndex == e.RowIndex)
            {
                e.CellStyle.Font = new Font("Arial"10.0f, FontStyle.Bold);
            }
        }

Hat keine Auswirkung. Was mache ich hier noch falsch?

Gruß
Steffen

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 15.02.12 11:12 
Hallo Steffen,

wie schon geschrieben, mußt du selber zeichnen mittels e.Graphics.DrawString, s.a. das Beispiel zu DataGridViewCellPaintingEventArgs-Klasse.
Steffen124 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 16.02.12 16:29 
Hi,

ich habe es jetzt mit dem überschreiben der dataGritView_RowPrepaint-Methode hinbekommen.

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:
        private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
        {
            e.PaintParts = (DataGridViewPaintParts.SelectionBackground | DataGridViewPaintParts.ContentForeground | DataGridViewPaintParts.Focus);
            DataGridView dgv = sender as DataGridView;
            int printTimeColIndex = dataGridView1.Columns["PrintTime"].Index;
            Rectangle borderRect = new Rectangle(e.RowBounds.X, e.RowBounds.Y, e.RowBounds.Width - 1, e.RowBounds.Height - 1);
            {
                if ((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected)
                {
                    using (LinearGradientBrush lgb = new LinearGradientBrush(e.RowBounds, ProfessionalColors.ToolStripGradientMiddle, ProfessionalColors.ToolStripContentPanelGradientBegin, 90F))
                    {
                        using (Pen p = new Pen(ProfessionalColors.ButtonPressedBorder))
                        {
                            e.Graphics.DrawRectangle(p, borderRect);
                        }
                    }
                }
                else
                {
                    using (LinearGradientBrush lgb = new LinearGradientBrush(e.RowBounds, ProfessionalColors.ToolStripContentPanelGradientEnd, ProfessionalColors.ToolStripContentPanelGradientBegin, 0F))
                    {
                        if (dgv[6, e.RowIndex].Value != null)
                        {
                            if (dgv[6, e.RowIndex].Value.ToString() == "1")
                            {
                                e.Graphics.FillRectangle(lgb, e.RowBounds);
                                e.Graphics.FillRectangle(new SolidBrush(Color.LightGreen), borderRect);
                            }
                            else if (dgv[7, e.RowIndex].Value.ToString() == "geloescht")
                            {
                                e.Graphics.FillRectangle(lgb, e.RowBounds);
                                e.Graphics.FillRectangle(new SolidBrush(Color.LightGray), borderRect);
                            }
                            else
                            {
                                e.Graphics.FillRectangle(lgb, e.RowBounds);
                                e.Graphics.FillRectangle(new SolidBrush(Color.LightSalmon), borderRect);
                            }
                        }
                    }
                }
            }
        }


Nach dem Laden (bzw. neuladen) der Daten in dats DGV wird jetzt aber die aktuelle (also die wo der Cursor steht) nicht gezeichnet. Da scheint das Hintergrund Fenster durch. Wenn ich den Cursor z.B. eine Zeile nach unten und dann wieder zurück setze (mit den Cursortasten) wird die aktuelle Zeile richtig gezeichnet.
Ich babe jetzt eine Notlösung hingeferkelt bei der ich den cursor programmgesteuert hin und her setzte um den Effekt zu erreichen.
Wie kann ich erreichen, dass die aktuelle Zeile immer richtig gezeichnet wird.

MfG
Steffen

Moderiert von user profile iconKha: C#-Tags hinzugefügt