2010-11-01 5 views
9

J'ai un DataGridView. Je mis son accessoire .DataSource être un BindingList de mes propres objets: un BindingList<IChessItem>Formatage DataGridView conditionnel

J'ai ensuite créé des colonnes pour elle ..

DataGridViewTextBoxColumn descColumn = new DataGridViewTextBoxColumn(); 
    descColumn.DataPropertyName = "Description"; 
    descColumn.HeaderText = "Description"; 
    descColumn.Width = 300; 

    DataGridViewTextBoxColumn gameIDColumn = new DataGridViewTextBoxColumn(); 
    gameIDColumn.DataPropertyName = "GameID"; 
    gameIDColumn.HeaderText = "Game ID"; 
    gameIDColumn.Width = 60; 

    dataGrid.Columns.Add(descColumn); 
    dataGrid.Columns.Add(gameIDColumn); 

Ma question est .. Je veux colorer l'une des colonnes VERT basé sur des données dans un autre champ de ma liste de liaison). Comment puis-je faire ceci?

Je n'ai pas vraiment montrer ce domaine, je veux juste agir sur les données qu'il contient ..

dans mon cas, l'un des champs de IChessItem indique si le dossier est nouveau, et je Vous voulez colorer les autres champs de la vue de données pour refléter cela.

Répondre

21

Vous pouvez utiliser l'événement 'CellFormatting' de DataGridView. DataGridViewCellFormattingEventArgs contient des index de la ligne et de la colonne de la cellule en cours lorsqu'elle est liée. J'espère que mon exemple de code fait un certain sens pour vous:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    // Compare the column to the column you want to format 
    if (this.dataGridView1.Columns[e.ColumnIndex].Name == "ColumnName") 
    { 
     //get the IChessitem you are currently binding, using the index of the current row to access the datasource 
     IChessItem item = sourceList[e.RowIndex]; 
     //check the condition 
     if (item == condition) 
     { 
      e.CellStyle.BackColor = Color.Green; 
     } 
    } 
} 
+0

intéressant. Cela semble devoir fonctionner, malheureusement, this.dataGridView1.Columns [e.ColumnIndex] .Name renvoie "" chaque fois qu'il arrive ici. Il semble que cela devrait fonctionner. – KevinDeus

+0

okok .. Je l'ai eu à travailler en utilisant le .DataPropertyName (depuis que cela a été configuré dans mon code ci-dessus), et en le renvoyant à l'élément de données (comme mon sourcelist a été effacé par ce point ..) IChessItem item = ((BindingList ) this.dgvAvailableMoves.DataSource) [e.RowIndex]; – KevinDeus

+2

Une approche plus robuste consiste à comparer directement à la colonne au lieu de vérifier le nom de la colonne, c'est à dire 'if (dataGridView.Columns [e.ColumnIndex] == dataGridViewColumnXXX) ...' –

0

Vous pouvez remplir des données dans votre DataGridView en utilisant une boucle ou source de données. Ensuite, pour chaque DataGridViewRow dans DataGridView1.Rows ----

Indiquez la valeur de référence que vous souhaitez modifier, puis définissez la propriété DataGridviewCell [index] .style.backColor.

+5

Veuillez ne pas aller de cette façon pour le formatage cellules - si vous avez 10000 lignes x 20 colonnes, vous allez vérifier 200000 cellules. D'un autre côté, si vous utilisez l'événement CellFormatting, vous effectuez le formatage uniquement pour les cellules visibles (ce qui est plus rapide). – zeroDivisible