2009-09-30 29 views
2

J'ai un DataGridView qui a une classe en tant que DataSource.C# DataGridView Texte en couleur d'une seule ligne

La classe contient une chaîne d'ID, 2x DateTimes et une valeur booléenne.

J'ai écrit du code pour changer le texte d'une ligne qui correspond à un identifiant que je passe à la méthode Red, mais rien de ce que j'ai essayé n'a fonctionné.

C'est ce que j'ai jusqu'à présent:

public void ShowInstanceAsTerminated(String id) 
{ 
    foreach (DataGridViewRow dgvRow in dgvRIM.Rows) 
    { 
     if (dgvRow.Cells[0].Value.ToString() == id) 
     { 
      dgvRow.DefaultCellStyle.ForeColor = Color.Red; 
     } 
    } 
} 

Ceci est l'une des nombreuses variantes de code que je l'ai essayé, mais les cellules en question ne changera jamais !!

Merci Neil

Répondre

10

Essayez ce format:

dgvRIM.Rows[myRow].Cells[0].Style.ForeColor = Color.Red; 

Si vous souhaitez définir toute la ligne, boucle sur toutes les cellules.

+0

+1 - c'était le même concept que j'essayais de faire passer, mais vous l'avez mieux exprimé. – David

+0

Cela n'a pas fonctionné pour moi. Au cours d'une session de débogage, je peux voir le style appliqué à la cellule, mais il ne change jamais réellement. La prochaine fois, elle n'est toujours pas réglée. Je me demande si je dois définir cette ligne comme étant la ligne après l'avoir modifiée. Quelque chose comme: dgvRIM.Row [myrow] = newRow; Hmmmm .... des pensées pendant que je me laisse aller? – neildeadman

+0

Que diriez-vous d'ajouter une ligne de code après avoir changé la couleur pour forcer la mise à jour de datagridview? Le code suivant doit faire cela: dvgRIM.Invalidate(); – David

0

Vous devez modifier les cellules individuelles.

Ceci est le code VB levé à partir d'une application où je suis capable de le faire avec succès, mais il ne devrait pas être difficile de convertir cela en C#.

For i As Integer = 0 To ds.Tables("AddressChanges").Rows.Count - 1 
       If ds.Tables("AddressChanges").Rows(i)("iSeriesAddress").ToString <> ds.Tables("AddressChanges").Rows(i)("CSIAddress").ToString() Then 
        Me.dgAddressDiscrepancies.Rows(i).Cells("iSeriesAddress").Style.BackColor = Color.Yellow 
        Me.dgAddressDiscrepancies.Rows(i).Cells("CSIAddress").Style.BackColor = Color.Yellow 
       End If 
Next 
+0

Il veut changer le ForeColor de Row, ceci peut être fait sans avoir à modifier ForeColor/BackColor de chaque cellule. –

+0

En théorie, vous devriez avoir raison, mais en pratique, j'ai constaté que cela ne fonctionne pas. Sauf si quelque chose a changé, c'est ... Mon code était .Net 2.0, donc il est possible que DataGridView ait été mis à jour, mais comme il l'a dit dans sa question, si vous essayez de l'appliquer à une ligne, il ne génère aucune erreur. pas changer la couleur non plus. En tout cas, ma réponse est de changer la couleur du fond, pas la couleur, mais le concept est le même. @Eric J a répondu avec la même idée mais sous une forme meilleure et plus claire. – David

+0

@David Stratton: Je viens de le tester et ça marche (voir ma réponse). Pour quelle raison cela n'a pas fonctionné dans votre cas? Pourquoi le réglage de la ForeColor pour les cellules individuelles fonctionnerait-il mieux? –

5

Utilisez l'événement CellFormatting de DataGridView pour apporter des modifications aux cellules individuelles qui composent une ligne.

Quelque chose comme ça (attention, non testé):

private void dgvRIM_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { 
    if (dgvRIM.Rows[e.RowIndex].Cells[0].Value.ToString() == id) { 
    e.CellStyle.ForeColor = Color.Red; 
    } 
} 
+0

+1. Vous pouvez utiliser e.Value. – Vivek

+0

+1. Vivek, il ne peut pas utiliser e.Value, il veut vérifier la valeur de la première cellule de la ligne qui n'est pas nécessairement la cellule courante. –

+0

Cela fonctionne et définit le style de toutes les cellules de la ligne sans boucler dans chaque cellule –

0

Je viens de tester votre code (réglage de la ForeColor avec DefaultCellStyle) et réalise un travail (avec .NET 3.5, mais je ne pense pas que Winforms a évolué depuis 2.0). Maintenant, je ne sais pas pourquoi cela ne fonctionne pas pour vous ... peut-être que vous appelez le code avant que les lignes sont ajoutées, ou vous rechargez les lignes après que votre code est appelé ???

De toute façon, vous êtes probablement mieux avec la solution de Jay Riggs, car il fonctionnera même si vous ajoutez de nouvelles lignes par la suite.

0

Je crois que la solution réside dans QUAND vous définissez la couleur, pas la méthode dans laquelle vous le faites. Plusieurs événements différents ont été suggérés et certains vont effectivement fonctionner. L'un des problèmes liés à l'utilisation de la mise en forme de cellule, de la databindingcomplete ou même des événements paint est qu'ils se déclenchent plusieurs fois. D'après ce que j'ai compris, il y a un problème avec le contrôle datagridview en ce sens que vous ne pouvez pas changer la couleur de l'une des cellules tant que le formulaire n'a pas été affiché. Ainsi, les méthodes qui s'exécutent, ou les événements qui se déclenchent avant l'appel de Shown() ne changeront pas la couleur. Les événements qui sont considérés comme la solution au problème fonctionnent généralement, mais comme ils sont appelés plusieurs fois, ils peuvent ne pas être la réponse la plus efficace.

Probablement la solution la plus simple au problème est de mettre votre code pour remplir/colorer vos grilles dans la méthode Shown() de votre formulaire au lieu du constructeur. Ci-dessous un lien vers un post sur les forums msdn qui m'a indiqué la solution, il est marqué comme la réponse aux 3/4 de la page.

MSDN forums post with the Solution

1

Cela fonctionne bien

private void grid1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    DataGridViewRow row = grid1.Rows[e.RowIndex];// get you required index 
    // check the cell value under your specific column and then you can toggle your colors 
    row.DefaultCellStyle.BackColor = Color.Green; 
} 
0

Il semble qu'il y ait un bug avec TabControl que quand il a plus d'un onglet, cellstyles qui sont créés avec le code ne sont appliqués à la DataGridView du premier onglet, donc pour résoudre le problème, vous pouvez déplacer votre DataGridView vers le premier onglet ou vous pouvez utiliser l'événement SelectedIndexChanged de TabControl et mettre yo votre code de style dans cet événement.

0
row.DefaultCellStyle.ForeColor = Color.Red; 

Cela fonctionne pour .NET 4.0 et au moins.

Questions connexes