更改datagrid行单元格的颜色

时间:2013-12-18 12:40:53

标签: c# wpf datagrid

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

有100行。

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

让我们说例如第15行和我想要的背景颜色是绿色。

的Datagrid

<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>

2 个答案:

答案 0 :(得分:0)

实际上没有方法可以访问WPF Datagrid中的单个行,你不应该这样做! 更好的方法是使用样式设置器

<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);
    }
}

}

现在你可以使用:

获取DataGrid第0行第15行
var cell = dataGrid.GetCell( 15, 0);

并将颜色设置为绿色

cell.Background = Brushes.Green;

答案 1 :(得分:0)

LoadingRow的{​​{1}}事件添加处理程序,如下所示:

DataGrid

然后在后面的代码中:

    <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>