基于单元格值的 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 行背景的主要内容,如果未能解决你的问题,请参考以下文章