WPF DataGrid如何根据SQL查询结果设置对应行颜色?
实现WPF DataGrid中cancled列值为1时行变色的解决方案
一、修正数据模型与数据加载逻辑
你的现有C#代码仅读取了数据但未将cancled值绑定到DataGrid的数据源对象中,需先确保每个数据项包含对应属性:
- 创建数据实体类(示例):
public class JobItem { public int Id { get; set; } public int Cancled { get; set; } // 对应数据库cancled列,值为1或0 // 根据表结构添加其他属性 }
- 修改数据加载代码,将查询结果填充到实体集合并绑定到DataGrid:
List<JobItem> jobList = new List<JobItem>(); // 注意:字符串拼接SQL存在注入风险,建议改用参数化查询或ORM框架 string lbcompjob = $"SELECT * FROM {Table} WHERE [cancled] = 1"; using (SqlCommand cmd = new SqlCommand(lbcompjob, conn)) { try { conn.Open(); using (SqlDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { JobItem item = new JobItem(); item.Id = Convert.ToInt32(dr["Id"]); item.Cancled = Convert.ToInt32(dr["cancled"]); // 读取并赋值其他属性 jobList.Add(item); } } // 将集合绑定到DataGrid yourDataGridName.ItemsSource = jobList; } catch (Exception ex) { // 添加实际异常处理,如日志记录或用户提示 Console.WriteLine(ex.Message); } finally { if (conn.State == ConnectionState.Open) conn.Close(); } }
二、修改XAML的DataGrid行样式
在现有RowStyle中添加针对Cancled属性的DataTrigger,触发行颜色变更:
<DataGrid x:Name="yourDataGridName"> <DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Setter Property="IsHitTestVisible" Value="False"></Setter> <Style.Triggers> <!-- 保留原有Suspended触发器(若需) --> <DataTrigger Binding="{Binding Suspended}" Value="Running"> <Setter Property="Background" Value="#FFEA2B0D"/> </DataTrigger> <!-- 新增cancled值为1的行样式触发器 --> <DataTrigger Binding="{Binding Cancled}" Value="1"> <Setter Property="Background" Value="#FFE57373"/> <!-- 自定义背景色 --> <Setter Property="Foreground" Value="White"/> <!-- 可选:修改文字颜色 --> </DataTrigger> </Style.Triggers> </Style> </DataGrid.RowStyle> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Id}" Width="40" Header=" Job ID " Foreground="Black" IsReadOnly="True"> <DataGridTextColumn.HeaderStyle> <Style TargetType="{x:Type DataGridColumnHeader}"> <Setter Property="Background" Value="#FF8A8A8A"/> </Style> </DataGridTextColumn.HeaderStyle> </DataGridTextColumn> <!-- 可选:显示cancled列 --> <DataGridTextColumn Binding="{Binding Cancled}" Header="Canceled" IsReadOnly="True"/> </DataGrid.Columns> </DataGrid>
三、额外说明
- 若数据库中
cancled是bit类型(值为1对应bool类型的True),需将DataTrigger的Value改为True,同时实体类中Cancled属性改为bool类型。 - 若需要动态更新行样式,建议实体类实现
INotifyPropertyChanged接口,确保属性变化时UI自动刷新。
内容的提问来源于stack exchange,提问作者Vegas Johnson
相关产品推荐
相关产品推荐

