HomeAbout Me

How to freeze last column in WPF datagrid?

By Daniel Nguyen
Published in WPF - CSharp
August 10, 2023
1 min read
How to freeze last column in WPF datagrid?

Having two DataGrids next to each other, with the right one having just the column you want to be fixed.

<Window x:Class="FrozenGrid.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="450" Width="800">
<DockPanel Margin="50">
<Slider DockPanel.Dock="Bottom" Value="5" Minimum="0" Maximum="6"
TickFrequency="1" IsSnapToTickEnabled="True" ValueChanged="OnSliderSlided" />
<DataGrid DockPanel.Dock="Right" Name="_frozen" BorderThickness="0,1,1,1" AutoGenerateColumns="False" ScrollViewer.ScrollChanged="OnFrozenScrolled" HorizontalScrollBarVisibility="Visible">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding [5]}" Header="F" />
</DataGrid.Columns>
</DataGrid>
<DataGrid Name="_grid" AutoGenerateColumns="False" VerticalScrollBarVisibility="Hidden" ScrollViewer.ScrollChanged="OnGridScrolled">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding [0]}" Header="A" />
<DataGridTextColumn Binding="{Binding [1]}" Header="B" />
<DataGridTextColumn Binding="{Binding [2]}" Header="C" />
<DataGridTextColumn Binding="{Binding [3]}" Header="D" />
<DataGridTextColumn Binding="{Binding [4]}" Header="E" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</Window>
using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace FrozenGrid
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
double[][] data = new double[50][];
Random random = new Random();
for (int i = 0; i < 50; i++)
data[i] = Enumerable.Range(0, 10).Select(r => random.NextDouble()).ToArray();
_grid.ItemsSource = data;
_frozen.ItemsSource = data;
}
private ScrollViewer _gridScroll;
private ScrollViewer _frozenScroll;
private void OnGridScrolled(object sender, ScrollChangedEventArgs e) => OnScrolled(_frozen, ref _frozenScroll, e);
private void OnFrozenScrolled(object sender, ScrollChangedEventArgs e) => OnScrolled(_grid, ref _gridScroll, e);
private void OnScrolled(DataGrid targetGrid, ref ScrollViewer targetScroll, ScrollChangedEventArgs e)
{
if (targetScroll == null)
targetScroll = (ScrollViewer)VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(targetGrid, 0), 0); // Grid > DG_ScrollViewer
targetScroll.ScrollToVerticalOffset(e.VerticalOffset);
}
private void OnSliderSlided(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (!IsInitialized)
return;
if (e.NewValue > e.OldValue)
{
int freeColumns = (int)(e.NewValue - e.OldValue);
for (int i = 0; i < freeColumns; i++)
{
DataGridColumn c = _frozen.Columns.First();
_frozen.Columns.Remove(c);
_grid.Columns.Add(c);
}
}
else
{
int fixColumns = (int)(e.OldValue - e.NewValue);
for (int i = 0; i < fixColumns; i++)
{
DataGridColumn c = _grid.Columns.Last();
_grid.Columns.Remove(c);
_frozen.Columns.Insert(0, c);
}
}
_grid.Visibility = _grid.Columns.Count > 0 ? Visibility.Visible : Visibility.Collapsed;
_frozen.Visibility = _frozen.Columns.Count > 0 ? Visibility.Visible : Visibility.Collapsed;
_grid.VerticalScrollBarVisibility = _frozen.Columns.Count < 1 ? ScrollBarVisibility.Visible : ScrollBarVisibility.Hidden;
}
}
}

Tags

#WPF

Share

Previous Article
C# Base Keyword
Next Article
WPF Basic Controls

Related Posts

WPF DATA BINDING
January 02, 2024
1 min
© 2025, All Rights Reserved.
Powered By

Quick Links

About Me

Legal Stuff

Social Media