基于单元格值的 DataGrid 行背景

Posted

技术标签:

【中文标题】基于单元格值的 DataGrid 行背景【英文标题】:DataGrid Row Background Based On Cell Value 【发布时间】:2011-11-14 22:53:30 【问题描述】:

我目前正在研究 C# WPF 数据网格。我有一个 DataGrid,它具有自动生成的列,并且代码连接到 SQLite 数据库并创建一个数据集,然后将此数据集设置为 DataGrid ItemsSource。

下面是 DataGrid 的 XAML 代码

<DataGrid AutoGenerateColumns="True"
          Margin="12,71,12,32"
          Name="tblLog"
          ColumnWidth="*"
          CanUserResizeRows="False"
          AreRowDetailsFrozen="False"
          CanUserAddRows="True"
          CanUserDeleteRows="True"
          IsReadOnly="True"
          MouseDoubleClick="tblLog_MouseDoubleClick">                
</DataGrid>

下面是为 DataGrid 设置 ItemsSource 的代码

try

    DataSet ds = new DataSet();
    SQLiteDataAdapter da = new SQLiteDataAdapter(query, db.conn);
    da.Fill(ds);

    //tblGrid.AutoGenerateColumns = true;
    tblGrid.ItemsSource = ds.Tables[0].DefaultView;                    

catch (SQLiteException ex)

    MessageBox.Show("Unable to retrieve logins from database.\n\n" + ex.Message + "\n\nError Code: " + ex.ErrorCode);

数据库中显示的列(自动生成)是 ID、日期、时间、状态。 我需要做的是,如果状态列的一行中的值等于错误,则更改该行的背景颜色。

我假设我需要在 DataGrid 标记中添加某种样式标记和 DataTriggers,但不确定我需要什么。我对设置 ItemsSource 的代码所做的任何尝试都会显示一个错误,指出在添加 ItemsSource 之前 Source 需要为空。

感谢您提供的任何帮助。

【问题讨论】:

我们为单元格和行设置样式的方式是使用未命名的无键样式。当我们指定它们的 TargetType 时,它​​们适用于所有元素。 codeproject.com/KB/WPF/WPFDataGridExamples.aspx 【参考方案1】:

您可以使用 DataTrigger 来执行此操作。

这是一个快速示例。我创建了一个名为 Person 的类,其属性为 Name、Age 和 Active。

public class Person

    public string Name  get; set; 
    public int Age  get; set; 
    public bool Active  get; set; 

在主窗口的构造函数中,我将 3 个Person 对象添加到一个列表中,然后将该列表绑定到DataGrid

public partial class MainWindow : Window

    public MainWindow()
    
        InitializeComponent();

        List<Person> people = new List<Person>();
        people.Add(new Person() 
         
            Name = "John Doe",
            Age = 32,
            Active = true
        );
        people.Add(new Person()
        
            Name = "Jane Doe",
            Age = 30,
            Active = true
        );
        people.Add(new Person()
        
            Name = "John Adams",
            Age = 64,
            Active = false
        );
        tblLog.ItemsSource = people;
    

然后在 MainWindow 的 XAML 中,我创建一个 DataTrigger 样式作为资源。

<Window.Resources>
    <Style TargetType="DataGridRow">
        <Style.Triggers>
            <DataTrigger Binding="Binding Active" Value="False">
                <Setter Property="Background" Value="Red" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

此触发器的作用是从 DataGridRow 中 Person 对象的 Active 字段中获取值,如果该值为 false,则将行的背景颜色变为红色。

【讨论】:

感谢您的帮助。但是,当数据网格来自数据库时,这将如何工作。这看起来好像是在代码中手动分配字段。这将如何与数据库绑定一起工作。遇到这种事情,有点对不起新手 @Boardy...它应该完全一样。我只是将数据集合绑定到 DataGrid。本质上,这与使用数据库数据绑定时 DataSet 所做的事情相同。 非常感谢您的帮助。我很困惑,因为我认为样式是在 DataGrid 标记而不是 Window.Resources 中完成的。再次感谢您的帮助

以上是关于基于单元格值的 DataGrid 行背景的主要内容,如果未能解决你的问题,请参考以下文章

基于 rhandsontable 中单元格值的颜色行

以编程方式获取或设置 Datagrid 中的单元格值

基于行项目值的wpf datagrid单元格样式

VBA 按钮 - 基于单元格值而不是 ActiveCell

如何使用 Pandas 在 Python 中基于同一行中的另一个单元格设置单元格值

基于单个单元格值的 Google 电子表格中的重复行