Frage

Ich bin mit C #, WinForms und .Net 3.5

Meine Form hat eine benutzerdefinierte DataGridView (doppelt gepufferte während meiner Cellformatting Ereignisse zu verhindern, flackernd, wie hier zu sehen ). Wenn ich eine Datenbank-Suche durchführen, ich habe die resultierende Datensatz an den datagridview binden.

Ich behandle die CellFormatting Ereigniszeilen eine bestimmte Farbe zu malen, auf ihre Daten abhängig.

My Datagridview-Code:

resultsGridView.DataSource = results.DefaultViewManager.DataSet.Tables[0];
resultsGridView.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue;
resultsGridView.BorderStyle = BorderStyle.Fixed3D;
resultsGridView.CellFormatting += new DataGridViewCellFormattingEventHandler(resultsGridView_CellFormatting);

My Cellformatting-Code:

void resultsGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    int rowIndex = e.RowIndex;
    DataGridViewRow therow = resultsGridView.Rows[rowIndex];
    if ((bool)therow.Cells["Sealed"].Value == true)
    {
        therow.DefaultCellStyle.BackColor = Color.Pink;
    }
    if (therow.Cells["Database"].Value as string == "PNG")
    {
        therow.DefaultCellStyle.BackColor = Color.LightGreen;
    }
}

Alles funktioniert gut, außer dass, wenn ich das Cellformatting handhaben, die Paint-Ereignis der ganzen Form scheint ausgeschaltet zu werden. Der Cursor bleibt in der Textbox zu blinken, und das Menustrip sieht die Form wie folgt aus:

Die Spitze ist vor der Suche, den Boden nach. Die Menüleiste wird neu gezeichnet, nicht bis ich die Maus über, wo die menuitems sind, und dann das letzte Element hervorgehoben werden wird auch so bleiben, wenn ich die Maus aus der Menüleiste zu bewegen. Bewegen der Form scheint es zu veranlassen, neu zu zeichnen, aber dann bleibt das Problem.

die resultsGridView.CellFormatting Zeile im Datagridview-Code kommentiert heraus behebt das Problem vollständig.

Bin ich die Zellen falsch Malerei, oder ist es etwas anderes muss ich umgehen?

War es hilfreich?

Lösung

Sie verursachen wahrscheinlich eine Ausnahme in diesem Fall. Ich bin mir nicht sicher, wie die Handhabung definiert ist, aber mit einem Try-Catch den Code umgeben wäre ein erster Schritt sein.

try 
{
   int rowIndex = e.RowIndex;
   ....   
}
catch(Exception ex)
{
    System.Diagnostics.Trace.Error(ex.message);
}

Auf dem zweiten Blick, ich glaube nicht, therow.Cells["Sealed"] funktionieren. Probieren Sie etwas wie therow.Cells["dataGridViewTextBoxColumn2"]. Zellen werden durch Spaltennamen , nicht indiziert DataPropertyName .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top