以编程方式更改单元格颜色

时间:2017-06-20 16:06:26

标签: c# wpf

我有两个Ints列表,我需要将它们并排放入两个垂直列中。如果数字不匹配,我需要高亮显示(一个或两个单元格,无关紧要。更改背景或字体颜色,无关紧要)。

我最初是并排显示这些ListBoxes但当我发现很难以编程方式更改特定单元格的颜色时,我开始查看DataGrid,但这也证明很难+很多我在网上找到的指南似乎是Windows Forms专注的,而不是WPF。

我认为这将是一项简单的任务,建议的控制是什么,请指导我如何识别这些不同的细胞/索引,并更新它们的外观。

额外信息:两个列表都不会非常长(每个<15)。

我在使用datagrid时试过这个;

dgdResults.Rows[0].Cells[0].Style.BackColor = Color.Red;

3 个答案:

答案 0 :(得分:1)

DataGrid / ListBox是ItemsControls,适用于单个集合。我建议使用list1和list2 属性中的一对项创建其他对象列表,这些项指示不同的项,然后在UI中显示该列表。

var L1 = new List<int> {1, 2, 3, 4, 5};
var L2 = new List<int> {1, 2, 0, 4, 5};
var results = L1.Zip(L2, (i, j) => new {Previous = i, Current = j, IsDifferent = i != j});
ListResults.ItemsSource = results;
<ItemsControl Name="ListResults">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <UniformGrid Rows="1">
                <UniformGrid.Style>
                    <Style TargetType="UniformGrid">
                        <Style.Triggers>
                          <DataTrigger Binding="{Binding Path=IsDifferent}" Value="true">
                            <Setter Property="Background" Value="Crimson"/>
                          </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </UniformGrid.Style>
                <Label Content="{Binding Path=Previous}"/>
                <Label Content="{Binding Path=Current}"/>
            </UniformGrid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

diff

替代DataTable / DataGrid

var L1 = new List<int> {1, 2, 3, 4, 5};
var L2 = new List<int> {1, 2, 0, 4, 5};

var dt = new DataTable
            {
                Columns =
                {
                    {"Previous", typeof (int)},
                    {"Current", typeof (int)},
                    {"IsDifferent", typeof (bool)},
                }
            };
for (int x = 0; x < L1.Count; x++)
    dt.Rows.Add(L1[x], L2[x], L1[x] != L2[x]);

DgResults.ItemsSource = dt.DefaultView;
<DataGrid Name="DgResults" AutoGenerateColumns="False" ColumnWidth="*" IsReadOnly="True">
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=IsDifferent}" Value="true">
                    <Setter Property="Background" Value="Crimson"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>

    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=Previous}"/>
        <DataGridTextColumn Binding="{Binding Path=Current}"/>
    </DataGrid.Columns>
</DataGrid>

在DataTrigger中使用属性IsDifferent来更改背景

答案 1 :(得分:0)

在app.xaml中,创建一个要用于不匹配行的样式。

<Style TargetType="DataGridRow">
     <Setter Property="Background" Value="Red"/>
</Style>

如果你然后枚举行并找到一个不匹配的行,你可以像这样设置样式

Style style = Application.Current.FindResource("DataGridRow") as Style;
row.Style = style;

答案 2 :(得分:0)

从这里How to change single cell color of datagrid in wpf?和user1064519的答案我知道了

movies = [{"titel": "The Godfather", "jaar": 1972, "cijfer": 9.2, "regisseur": "Francis Ford Coppola"},
      {"titel": "The Shawshank Redemption", "jaar": 1994, "cijfer": 9.3, "regisseur": "Frank Darabont"},
      {"titel": "Schindler's List", "jaar": 1993, "cijfer": 8.9, "regisseur": "Steven Spielberg"},
      {"titel": "Raging Bull", "jaar": 1980, "cijfer": 8.2, "regisseur": "Martin Scorsese"},
      {"titel": "Casablanca", "jaar": 1942, "cijfer": 8.5, "regisseur": "Michael Curtiz"}]''' 

那对我有用!显然更改其他行/列的索引