2016-07-28 16 views
1

Ich versuche, das Zeichnen von DataGridViewRows in einer abgeleiteten DataGridView durch Überschreiben der OnRowPrePaint-Methode vollständig zu steuern. Um den Ansatz zu testen, versuche ich, den Inhalt und den Hintergrund aller Zellen unter Verwendung der EventArgs Farbmethoden, z. e.PaintCells() oder e.PaintCellsBackground() und dann EventArgs.Handled = true einstellen, um zu verhindern, dass eine der anderen Malmethoden ausgelöst wird.Fehler beim Zeichnen von Zellen durch e.PaintCells() beim Überschreiben von DataGridViewRow.OnRowPrePaint

Mein Code so weit ist:

protected override void OnRowPrePaint(DataGridViewRowPrePaintEventArgs e) 
    { 
     using (SolidBrush brush = new SolidBrush(Color.Blue)) 
     { 
      e.Graphics.FillRectangle(brush, e.RowBounds); 
     }    

     e.PaintCellsBackground(e.RowBounds, true); 
     e.PaintCells(e.RowBounds, e.PaintParts); 

     e.Handled = true; 
    } 

ich dies erwartet die Zeile blau zu färben und dann die e.PaintCellsBackground() und e.PaintCells() Methoden, um die Zellen ontop dem blauen Hintergrund zu malen aber bin ich nur mit blauen Reihen vorgestellt mit nichts anderem gemalt. Die Bemerkungen auf der MSDN-Artikel auf PaintCellsBackground liest

die PaintCellsBackground Methode verwenden, wenn Sie die DataGridViewRow ziehen und seine Zellen Inhalte selbst. Wenn Sie die gesamte Zeile und den Inhalt der Zellen manuell zeichnen, legen Sie die HandledEventArgs.Handled-Eigenschaft auf true fest. Wenn HandledEventArgs.Handled true ist, treten die Ereignisse CellPainting und RowPostPaint nicht auf.

Was führt mich dazu zu glauben, dass ich in der Lage sein sollte, zu tun, was ich hoffe?

+0

Ich habe viel für meine Zelle Färbung mit row.Cells [n] .Style.BackColor, und row.DefaultCellStyle.BackColor .. etc – BugFinder

+0

Es ist unklar, was Sie fragen. Bitte formulieren Sie die Frage neu und sagen Sie, was das Problem ist und was erwartet wird. Teilen Sie auch einen effektiveren Code, wenn ein Problem im Code vorliegt. –

+0

danke für das Feedback @reza Ich habe meine Frage –

Antwort

1

Dank für das Feedback dankt, kann ich den Artikel nicht finden, aber ich gelesen, dass man e.handled = true in OnCellPainting und OnRowPostPaint und behandelt alle die Malerei in OnRowPrePaint aber ich nicht zu schätzen, dass dies bedeutete ALL des Bildes einstellen .

Wenn Sie in OnRowPrePaint einem der Lack Methoden aufrufen, wird OnCellPainting erscheint auch genannt und die eigentliche Malerei zu handhaben, wo, wie ich es in meinem Code erwartet, dass die e.PaintCells() Methode deaktiviert hatte die Malerei zu tun.

Beispiel 1

class MyDataGridView : DataGridView 
{ 
    protected override void OnRowPrePaint(DataGridViewRowPrePaintEventArgs e) 
    { 
     e.PaintCells(e.RowBounds, e.PaintParts); 
     e.PaintHeader(true); 
     e.Handled = true; 
    } 
    protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e) 
    { 
     base.OnCellPainting(e); 
    } 
} 

In diesem Beispiel OnRowPrePaint malt die Zellen und Kopf- und OnCellPainting Brände die Malerei und die DataGridView Farben zu tun, wie erwartet

Beispiel 2

class MyDataGridView : DataGridView 
{ 
    protected override void OnRowPrePaint(DataGridViewRowPrePaintEventArgs e) 
    { 
     e.PaintCells(e.RowBounds, e.PaintParts); 
     e.PaintHeader(true); 
     e.Handled = true; 
    } 
    protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e) 
    { 
     e.Handled = true; 
    } 
} 

In th Beispiel hierfür ist OnRowPrePaint Versuche, die Zellen und Überschriften zu malen, aber wenn OnCellPainting ausgelöst wird wahr und wird nichts behandelter gesetzt gemalt, was zu einem leeren DataGridView

Beispiel 3

class MyDataGridView : DataGridView 
{ 
    protected override void OnRowPrePaint(DataGridViewRowPrePaintEventArgs e) 
    { 
     e.Handled = true; 
    } 
    protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e) 
    { 
     base.OnCellPainting(e); 
    } 
} 

In diesem letzten Beispiel OnRowPrePaint wird behandelt, ohne dass irgendeine der Malmethoden aufgerufen wird, und OnCellPaint wird nie ausgelöst, um irgendeinen der Zeileninhalte zu malen, die Spaltenüberschriften werden gemalt, aber sonst nichts. Der Schlüssel war zu verstehen, wie OnRowPrePaint, OnCellPainting und OnRowPostPaint miteinander verbunden sind.

+0

* Der Schlüssel war zu verstehen, wie OnRowPrePaint, OnCellPainting und OnRowPostPaint miteinander verbunden sind. * Deshalb sollten Sie einen * effektiveren Code * schreiben * weil * das Problem etwas anderes ist, das wir mit diesem Code nicht reproduzieren können. *. Wenn Sie eine Frage stellen, ist die Frage [MCVE] (http://Stackoverflow.com/help/mcve) wirklich wichtig :) –

+0

@RezaAghaei danke für den Link, der Artikel ist wirklich nützlich. Erst als ich anfing, das Problem auf eine vorzeigbare Art und Weise zu lösen (was ich zuerst hätte tun sollen), wickelte ich meinen Kopf um das Problem! Ich muss lernen, einen Schritt zurück zu machen und nicht ständig in die Tiefe zu tauchen: D –