Question

J'utilise C #, WinForms et .Net 3.5

Ma forme a un DataGridView personnalisé (double tampon pour éviter le scintillement lors de mes événements CellFormatting, comme on le voit ici ). Lorsque j'effectue une recherche de base de données, je lie l'ensemble de données résultant du datagridview.

Je gère l'événement CellFormatting pour peindre les lignes d'une certaine couleur, en fonction de leurs données.

Mon code DataGridView:

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

Mon code 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;
    }
}

Tout fonctionne très bien, sauf que, quand je Manipulez le CellFormatting, l'événement de peinture de la forme tout semble être désactivé. Le curseur cesse de clignoter dans la zone de texte, et la MenuStrip du formulaire ressemble à ceci:

Le sommet est une recherche avant, le fond après. La barre de menu ne redessiner la souris jusqu'à ce que je sur l'endroit où les menuitems sont, puis le dernier élément à mettre en avant le restera quand je déplace la souris sur la barre de menus. Déplacement de la forme semble l'amener à repeindre, mais le problème persiste.

Commentant la ligne de resultsGridView.CellFormatting dans le code datagridview fixe complètement le problème.

Suis-je peignais les cellules mal, ou est-il quelque chose d'autre que je dois gérer?

Était-ce utile?

La solution

Vous causez probablement une exception dans cet événement. Je ne sais pas comment la manipulation est définie, mais entourant le code avec une prise d'essai serait une première étape.

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

Sur un second regard, je ne pense pas therow.Cells["Sealed"] fonctionnera. Essayez quelque chose comme therow.Cells["dataGridViewTextBoxColumn2"]. Les cellules sont indexées par Nom de la colonne , pas DataPropertyName .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top