evento CellFormatting DataGridView prevenire la pittura forma
-
11-09-2019 - |
Domanda
Sto usando C #, WinForms, e .Net 3.5
La mia forma ha un DataGridView
personalizzato (doppio buffer per evitare lo sfarfallio durante i miei eventi cellformatting, come si vede qui ). Quando si esegue una ricerca di database, mi legano l'insieme di dati risultante al datagridview
.
I gestire l'evento CellFormatting
di dipingere le righe di un certo colore, a seconda delle loro dati.
Il mio codice DataGridView:
resultsGridView.DataSource = results.DefaultViewManager.DataSet.Tables[0];
resultsGridView.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue;
resultsGridView.BorderStyle = BorderStyle.Fixed3D;
resultsGridView.CellFormatting += new DataGridViewCellFormattingEventHandler(resultsGridView_CellFormatting);
Il mio codice CellFormatting:
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;
}
}
Tutto grandi opere, tranne che, quando mi occupo del CellFormatting, evento Paint di tutto il modulo sembra essere spento. Il cursore smette di lampeggiare nella casella di testo, e MenuStrip del form è simile al seguente:
La parte superiore è prima di una ricerca, il fondo dopo. La barra dei menu non si ridisegna fino a quando ho mouse sopra dove i menuitems sono, e quindi l'ultimo elemento da evidenziare rimarrà in questo modo quando si sposta il mouse fuori dalla barra dei menu. Spostando il modulo sembra causare a ridipingere, ma poi il problema rimane.
Nel commentare la linea resultsGridView.CellFormatting
nel codice datagridview risolve completamente il problema.
Sono io dipingevo le cellule sbagliate, o c'è qualcos'altro che ho bisogno di gestire?
Soluzione
Probabilmente si sta causando un'eccezione all'interno di questo evento. Io non sono sicuro di come la gestione è definito, ma che circonda il codice con un tentativo di cattura sarebbe un primo passo.
try
{
int rowIndex = e.RowIndex;
....
}
catch(Exception ex)
{
System.Diagnostics.Trace.Error(ex.message);
}
In una seconda occhiata, non credo therow.Cells["Sealed"]
funzionerà. Provare qualcosa di simile therow.Cells["dataGridViewTextBoxColumn2"]
. Le cellule è indicizzato da Nome colonna , non DataPropertyName .