Search code examples
wpfwpfdatagrid

Can I get back the original column order (on a button click) when a user reorders the columns?


Please have a look at the following code. When I click the Revert to org order button the columns should be reordered to original datagrid order. Is there any possibility? Please help me...... //The following is my code

    <Window x:Class="GridTextBox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        Title="MainWindow" Height="350" Width="525" WindowState="Maximized" Loaded="MainWindow_Loaded" Background="Gray">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="30"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width=".25*"/>

            <ColumnDefinition Width=".25*"/>
            <ColumnDefinition Width=".25*"/>
            <ColumnDefinition Width=".25*"/>
        </Grid.ColumnDefinitions>
        <DataGrid ColumnReordered="datagrid1_ColumnReordered"  GotFocus="datagrid1_GotFocus" LoadingRowDetails="datagrid1_LoadingRowDetails"  Grid.ColumnSpan="3" Background="Gray" Grid.Row="1" Height="auto" Name="datagrid1" AutoGenerateColumns="False" Width="440" VerticalAlignment="Center" SelectionChanged="datagrid1_SelectionChanged">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Empid">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Name="txtEmpid"   Text="{Binding Empid}"></TextBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Empname">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Empname}"></TextBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Empname}"></TextBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Empaddress">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Empaddress}"></TextBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="EmpCity">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding EmpCity}"></TextBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Empstate">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding EmpState}"></TextBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="EmpCountry">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding EmpCountry}"></TextBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>           
            </DataGrid.Columns>

        </DataGrid>
        <Button Grid.Row="2" Grid.Column="2" Height="30" Content="Insert Employees" Click="Button_Click"></Button>
        <Button Grid.Row="2" Grid.Column="1" Height="30" Content="Revert to org order" Name="btn" Click="btn_Click"></Button>
    </Grid>
</Window>

Solution

  • You can keep in memory a small dictionary and on button click use the DisplayIndex Property of each column to reset the original view.


    EDIT: Add an example

    XAML

    <Grid>
       <Grid.RowDefinitions>
          <RowDefinition Height="281*" />
          <RowDefinition Height="30*" />
       </Grid.RowDefinitions>
       <DataGrid Name="datagrid1" ItemsSource="12345567" Loaded="datagrid1_Loaded">
          <DataGrid.Columns>
             <DataGridTextColumn Header="Col1" Binding="{Binding}" />
             <DataGridTextColumn Header="Col2" Binding="{Binding}" />
             <DataGridTextColumn Header="Col3" Binding="{Binding}" />
             <DataGridTextColumn Header="Col4" Binding="{Binding}" />
             <DataGridTextColumn Header="Col5" Binding="{Binding}" />
          </DataGrid.Columns>
       </DataGrid>
       <Button Grid.Row="1" Content="Reorder" Click="Button_Click"/>
    </Grid>
    

    and in your code behind:

    private Dictionary<int, string> originalOrder;
    private void datagrid1_Loaded(object sender, RoutedEventArgs e)
    {
       if (originalOrder == null) originalOrder = new Dictionary<int, string>();
       //I will save the header content as a string, 
       //but you can save anything you want to identify each column
       datagrid1.Columns.ToList().ForEach(c => originalOrder.Add(c.DisplayIndex, c.Header.ToString()));
    }
    
    private void Button_Click(object sender, RoutedEventArgs e)
    {
       originalOrder.ToList().ForEach(k =>
       {
        datagrid1.Columns.FirstOrDefault(c => c.Header.ToString() == k.Value).DisplayIndex = k.Key;
       });
    }