【问题标题】:DataGrid Row Background Based On Cell Value基于单元格值的 DataGrid 行背景
【发布时间】: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 需要为空。

感谢您提供的任何帮助。

【问题讨论】:

标签: c# wpf xaml wpfdatagrid


【解决方案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 中完成的。再次感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 2013-01-14
  • 2017-07-22
  • 2012-03-07
相关资源
最近更新 更多