MegaMilivoje
MegaMilivoje

Reputation: 1811

Setting DataGrid row height property programmatically

I have one question regarding standard WPF DataGrid in .NET 4.0.

When I try to set DataGrid grid row height programmaticaly using simple code:

private void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e)
{
    e.Row.Height = 120;            
}

everything goes fine till I try to resize grid row on the user interface /standard way on the side using mouse like in excel/ - then it appears grid row can't be resized. It just keep being 120. Its content by the way all goes messed up...

Like Sinead O'Connor would say: tell me baby - where did I go wrong?

Upvotes: 4

Views: 5561

Answers (2)

Christian
Christian

Reputation: 71

This works for me.

private void SetRowHeight(double height)
{
    Style style = new Style();
    style.Setters.Add(new Setter(property: FrameworkElement.HeightProperty, value: height));
    this.RowStyle = style;
}

Upvotes: 2

brunnerh
brunnerh

Reputation: 185489

You are not meant to set the Height of the row itself as it is resized via the header and such. There is a property, DataGrid.RowHeight, which allows you to do this properly.

If you need to set the height selectively you can create a style and bind the height of the DataGridCellsPresenter to some property on your items:

<DataGrid.Resources>
    <Style TargetType="DataGridCellsPresenter">
        <Setter Property="Height" Value="{Binding RowHeight}" />
    </Style>
</DataGrid.Resources>

Or you can get the presenter from the visual tree (i do not recommend this) and assign a height there:

// In LoadingRow the presenter will not be there yet.
e.Row.Loaded += (s, _) =>
    {
        var cellsPresenter = e.Row.FindChildOfType<DataGridCellsPresenter>();
        cellsPresenter.Height = 120;
    };

Where FindChildOfType is an extension method which could be defined like this:

public static T FindChildOfType<T>(this DependencyObject dpo) where T : DependencyObject
{
    int cCount = VisualTreeHelper.GetChildrenCount(dpo);
    for (int i = 0; i < cCount; i++)
    {
        var child = VisualTreeHelper.GetChild(dpo, i);
        if (child.GetType() == typeof(T))
        {
            return child as T;
        }
        else
        {
            var subChild = child.FindChildOfType<T>();
            if (subChild != null) return subChild;
        }
    }
    return null;
}

Upvotes: 5

Related Questions