更改数据网格行单元格的颜色

本文关键字:单元格 颜色 网格 数据 数据网 | 更新日期: 2024-10-25 16:55:15

我有一个数据网格,通过将其绑定到数据表来填充。

有 100 行。

使用 c# 如何更改特定单元格的背景颜色?

例如,假设

第 15 行和我想要的背景颜色是绿色。

数据网格

<DataGrid Name="grid" ItemsSource="{Binding}" Height="300" Width="900"
          AutoGenerateColumns="True"
          VerticalScrollBarVisibility="Disabled" HorizontalAlignment="Center" VerticalAlignment="Top" RowHeight="40">
            <DataGrid.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Orientation="Vertical" />
                </ItemsPanelTemplate>
            </DataGrid.ItemsPanel>
        </DataGrid>

更改数据网格行单元格的颜色

实际上,没有

访问 WPF 数据网格中单个行的方法,您不应该这样做!更好的方法是使用样式设置器

<Style TargetType="{x:Type DataGridCell}" x:Key="NumberCell">      
<Style.Setters>
    <Setter Property="Background" Value="{Binding backgroundColor></Setter>
</Style.Setters>

除非你不能这样做,否则还有其他选择:我前段时间在网上找到了这个解决方案,但不记得在哪里。

首先,我们需要一些辅助函数。只需添加此类

namespace YOURNAMESPACE.DataGridHelpers
/// <summary>
/// Extension methods for DataGrid
/// </summary>
public static class DataGridHelper
{
    /// <summary>
    /// Gets the visual child of an element
    /// </summary>
    /// <typeparam name="T">Expected type</typeparam>
    /// <param name="parent">The parent of the expected element</param>
    /// <returns>A visual child</returns>
    public static T GetVisualChild<T>(Visual parent) where T : Visual
    {
        T child = default(T);
        int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < numVisuals; i++)
        {
            Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
            child = v as T;
            if (child == null)
            {
                child = GetVisualChild<T>(v);
            }
            if (child != null)
            {
                break;
            }
        }
        return child;
    }

    /// <summary>
    /// Gets the specified cell of the DataGrid
    /// </summary>
    /// <param name="grid">The DataGrid instance</param>
    /// <param name="row">The row of the cell</param>
    /// <param name="column">The column index of the cell</param>
    /// <returns>A cell of the DataGrid</returns>
    public static DataGridCell GetCell(this DataGrid grid, DataGridRow row, int column)
    {
        if (row != null)
        {
            DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);
            if (presenter == null)
            {
                grid.ScrollIntoView(row, grid.Columns[column]);
                presenter = GetVisualChild<DataGridCellsPresenter>(row);
            }
            DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
            return cell;
        }
        return null;
    }
    /// <summary>
    /// Gets the specified cell of the DataGrid
    /// </summary>
    /// <param name="grid">The DataGrid instance</param>
    /// <param name="row">The row index of the cell</param>
    /// <param name="column">The column index of the cell</param>
    /// <returns>A cell of the DataGrid</returns>
    public static DataGridCell GetCell(this DataGrid grid, int row, int column)
    {
        DataGridRow rowContainer = grid.GetRow(row);
        return grid.GetCell(rowContainer, column);
    }
    /// <summary>
    /// Gets the specified row of the DataGrid
    /// </summary>
    /// <param name="grid">The DataGrid instance</param>
    /// <param name="index">The index of the row</param>
    /// <returns>A row of the DataGrid</returns>
    public static DataGridRow GetRow(this DataGrid grid, int index)
    {
        DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index);
        if (row == null)
        {
            // May be virtualized, bring into view and try again.
            grid.UpdateLayout();
            grid.ScrollIntoView(grid.Items[index]);
            row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index);
        }
        return row;
    }
    /// <summary>
    /// Gets the selected row of the DataGrid
    /// </summary>
    /// <param name="grid">The DataGrid instance</param>
    /// <returns></returns>
    public static DataGridRow GetSelectedRow(this DataGrid grid)
    {
        return (DataGridRow)grid.ItemContainerGenerator.ContainerFromItem(grid.SelectedItem);
    }
}

}

现在,您可以使用以下命令获取数据网格列0第15行:

var cell = dataGrid.GetCell( 15, 0);

并将颜色设置为绿色

cell.Background = Brushes.Green;

将处理程序添加到DataGridLoadingRow事件中,如下所示:

    <DataGrid Name="grid" ItemsSource="{Binding}" Height="300" Width="900"
            AutoGenerateColumns="True" VerticalAlignment="Top" RowHeight="40"
            VerticalScrollBarVisibility="Disabled" HorizontalAlignment="Center"  
            LoadingRow="DataGrid_LoadingRow" >
        <DataGrid.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel Orientation="Vertical" />
            </ItemsPanelTemplate>
        </DataGrid.ItemsPanel>
    </DataGrid>

然后在后面的代码中:

     int index = 0;
     public void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
     {
        var row = (DataRowView)e.Row.Item;
        //If you want the content of a specific column of the current row
        //var content = row.Row[0].ToString(); 
        if (index == 15)
        {
            e.Row.Background = new SolidColorBrush(Colors.DeepSkyBlue);
            e.Row.Foreground = new SolidColorBrush(Colors.Black);
        }
        index ++ ; //don't forget to increase the index
     }