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:

immagine barra dei menu

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?

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top