2017-09-26 3 views
0

Je rencontre des problèmes changer la couleur des lignes DataGrid, j'utilise la fonction suivanteChanger la couleur des lignes dans une grille de données dans WPF

int i = 0; 
private void gvDados_LoadingRow(object sender, DataGridRowEventArgs e) 
{ 
    DataGridRow rowContext = e.Row; 
    if (rowContext != null) 
    { 
     string Situacao = dt.Rows[i]["Situacao"].ToString(); 
     if (Situacao.Equals("V")) 
     { 
     SolidColorBrush brush = new SolidColorBrush(Color.FromArgb(100, 255, 104,0)); 
     rowContext.Background = brush; 
     } 
     else 
     { 
     SolidColorBrush brush = new SolidColorBrush(Color.FromArgb(100, 255, 232,0)); 
     rowContext.Background = brush; 
     } 

     i++; 
    } 
} 

Jusqu'à présent, si bon, je peux ajuster les couleurs en fonction de ce Je veux, le problème en question est quand j'utilise la barre de défilement horizontale pour descendre les registres ou grimper, alors toutes les couleurs sont mal configurées apparaissant au hasard. Comment puis-je résoudre ce problème afin que les choses ne changent pas lors du défilement?

Répondre

0

L'événement LoadingRow de DataGrid se déclenche chaque fois qu'un est 'instancié'. Lorsque vous faites défiler les lignes, vous pouvez entrer et sortir de la portée, et cet événement est déclenché à plusieurs reprises pour chaque ligne qui «se charge» dans la vue. En supposant que votre DataGrid est chargé à un événement tel qu'un clic de bouton ou une telle action, vous devez probablement colorier les lignes lorsque vous chargez réellement les données dans votre DataGrid, de préférence en utilisant une fonction écrite pour cela, et plus tard, appelez à nouveau la fonction si le contenu est modifié et que vous souhaitez afficher les couleurs en fonction du contenu modifié.

Quelque chose comme ceci:

// This could be a button event, or some other event after which you load data into the DataGrid 
void ButtonLoadEvent() 
{ 
    foreach(Datagrid Row) 
    { 
     FunctionThatChangesRowColor(Row); 
    } 
} 

EDIT:

code réel sur la façon d'obtenir des lignes DataGrid et appliquer la coloration. C'est une version modifiée de votre logique de coloration, et ici chaque ligne est colorée selon que son index de ligne est impair ou pair. Vous pouvez le remplacer par votre code. Passez le DataGrid complet à cette fonction.

private void ColorRow(DataGrid dg) 
{ 
    for (int i = 0; i < dg.Items.Count; i++) 
    { 
     DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(i); 

     if (row != null) 
     { 
      int index = row.GetIndex(); 
      if (index % 2 == 0) 
      { 
       SolidColorBrush brush = new SolidColorBrush(Color.FromArgb(100, 255, 104, 0)); 
       row.Background = brush; 
      } 
      else 
      { 
       SolidColorBrush brush = new SolidColorBrush(Color.FromArgb(100, 255, 232, 0)); 
       row.Background = brush; 
      } 
     } 
    } 
} 

Mais cela aussi est pas une solution parfaite car vous utilisez WPF, pas WinForms. Une suggestion que j'ai est d'aller pour une approche de liaison de données WPF, et laissez le XAML faire le code de couleur pour vous.

This est un exemple de code que j'utilise souvent à cette fin.

WPF Code approche:

<Window x:Class="ColorLibrary.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:ColorLibrary" 
     mc:Ignorable="d" 
     Loaded="Window_Loaded" 
     Title="MainWindow" Height="500" Width="400"> 
    <Window.Resources> 
     <Style TargetType="{x:Type DataGridRow}"> 
      <Style.Setters> 
       <Setter Property="Background" Value="{Binding Path=Code}"></Setter> 
      </Style.Setters> 
     </Style> 
    </Window.Resources> 
    <Grid> 

     <!-- Stuff --> 

     <DataGrid Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" 
        Name="dgvColors" 
        AutoGenerateColumns="False" 
        Margin="4"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn Header="#" Width="Auto"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Num}" VerticalAlignment="Center" Padding="3"></TextBlock> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTemplateColumn Header="HTML Code" Width="Auto"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Code}" VerticalAlignment="Center" Padding="3"></TextBlock> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTemplateColumn Header="Color" Width="*"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Color}" VerticalAlignment="Center" Padding="3"></TextBlock> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 

    </Grid> 
</Window> 

Dans,

<Setter Property="Background" Value="{Binding Path=Code}"></Setter> 

Code est une propriété dans une classe qui contient le nom de la couleur à utiliser pour colorer la cellule.

Ensuite, nous avons un ObservableCollection de ces objets de classe. Vous devez définir cette propriété (de chaque élément dans le ObservableCollection) à la couleur dont vous avez besoin pour chaque ligne à afficher.

+0

Je dois faire cela par programme comment lire chaque ligne dans la grille de données et changer sa couleur? en utilisant un moment et en fonction de ma condition changer la couleur –

+1

L'approche WPF _is_ le fait par programme. Vous laissez simplement XAML faire la coloration au lieu de le faire dans le code derrière. Mais si vous devez utiliser du code, consultez la mise à jour que j'ai publiée. Utilisez une boucle 'foreach' sur les lignes' DataGrid' et passez les lignes à la fonction qui les colore. – Sach

+0

Une erreur se produit lors de l'utilisation de foreach (DataGridRow Row dans gvData) {myfunction()} –