2009-12-01 9 views
3

J'utilise C#, WinForms et .Net 3.5DataGridView événement CellFormatting forme empêchant la peinture

Ma forme a une coutume DataGridView (double tampon pour éviter le scintillement lors de mes événements CellFormatting, as seen here). Lorsque j'effectue une recherche dans une base de données, je lie le jeu de données résultant au datagridview.

Je gère l'événement CellFormatting pour peindre des 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:

Menu bar picture http://img213.imageshack.us/img213/2430/menubar.jpg

Le sommet est une recherche avant, le fond après. La barre de menus ne sera pas redessinée jusqu'à ce que je passe la souris là où se trouvent les menuitems, et alors le dernier élément à mettre en surbrillance le restera si je déplace la souris hors de la barre de menus. Déplacer le formulaire semble le faire repeindre, mais le problème persiste.

Commenter la ligne resultsGridView.CellFormatting dans le code datagridview résout complètement le problème. Est-ce que je peins les cellules mal, ou y a-t-il autre chose que je dois manipuler?

Répondre

1

Vous êtes probablement à l'origine d'une exception dans cet événement. Je ne suis pas sûr de la façon dont la manipulation est définie, mais entourer le code avec une tentative d'attraper serait un premier pas.

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, et non DataPropertyName.

+0

La partie "Sealed" n'est pas la propriété data, mais plutôt une condition booléenne dans ma base de données. Le programme sur lequel je travaille fait une recherche sur un nom et peut montrer si notre dossier dans le département a été scellé ou non. –

+0

Aucune exception à attraper. J'ai ajouté 'Systems.Diagnotics.Trace.WriteLine (" start ")' au début de l'événement de mise en forme, et il exécute beaucoup, même après que les cellules ont été affichées et rien d'autre ne se passe. –

+0

Mais "Scellé" est-il le nom d'un objet Dgv Column? –