在Wpf中更改DataGrid中行的颜色

时间:2017-09-26 21:17:21

标签: c# wpf xaml datagrid

我在更改DataGrid行的颜色时遇到问题,我使用以下函数

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++;
   }
}

到目前为止,我可以根据自己的需要调整颜色,问题是当我使用水平滚动条向下移动寄存器或爬升时,所有颜色都是错误配置的,随机出现。如何解决此问题,以便在滚动时不会改变?

1 个答案:

答案 0 :(得分:1)

只要LoadingRow被'实例化',DataGrid Row事件就会触发。当您滚动行进入和退出作用域时,会对“加载”到视图中的每一行重复触发此事件。

假设您的某个事件(例如按钮点击或某些操作)加载了DataGrid,您可能需要在将数据实际加载到DataGrid时对行进行着色,最好是使用为此编写的函数,如果内容发生更改并且您希望根据更改的内容显示颜色,稍后再次调用该函数。

这样的事情:

// 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);
    }
}

修改

有关如何获取DataGrid行和应用着色的实际代码。这是着色逻辑的修改版本,此处每行的颜色取决于其行索引是奇数还是偶数。您可以将其替换为您的代码。

将整个DataGrid传递给此函数。

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

但是,当你使用WPF而不是WinForms时,这也不是一个完美的解决方案。我有一个建议是采用WPF DataBinding方法,让XAML为你做颜色编码。

This是我经常用于此目的的代码示例。

WPF方法代码:

<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>

在,

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

Code是类中的一个属性,它包含用于为单元格着色的颜色名称。

然后我们有一个ObservableCollection个类对象。您需要将此属性(ObservableCollection中的每个项目)设置为每行显示所需的颜色。