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