Tuesday, June 22, 2010

Created Issue: Hiding and Showing a column with a TextBlock as the header causes exception [13589]

Created Issue: Hiding and Showing a column with a TextBlock as the header causes exception [13589]: "If you set a column header to a text block (rather than a string), and you set the visiblity of the column to collapsed, then later set the visibility back to Visible grid gives an invalid operation exception "Specified element is already the logical child of another element. Disconnect it first." Below is complete code for a program to demonstrate. Run the program, click the three buttons in order.

<Window x:Class="WpfApplication1.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">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>

</Grid.RowDefinitions>
<DataGrid AutoGenerateColumns="True" Name="dataGrid1" ItemsSource="{Binding}"/>
<StackPanel Grid.Row="1" Orientation="Horizontal">
<Button Click="SetTextBlocks_Click">Set Headers to TextBlocks</Button>
<Button Click="Hide_Click">Hide Weight Column</Button>
<Button Click="Show_Click">Show Weight Column</Button>
</StackPanel>
</Grid>
</Window>

Code Behind:

using System.Windows;
using System.Windows.Controls;
using System.Collections.ObjectModel;

namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{

InitializeComponent();

ObservableCollection<Item> Items = new ObservableCollection<Item>();
Items.Add(new Item(1, "John", 200));
Items.Add(new Item(2, "Mary", 100));
Items.Add(new Item(3, "Jane", 150));
DataContext = Items;


}

public class Item
{
public int ID { get; private set; }
public string Name { get; private set; }
public double Weight { get; private set; }

public Item(int id, string name, double weight)
{
ID = id;
Name = name;
Weight = weight;
}
}

private void Hide_Click(object sender, RoutedEventArgs e)
{
dataGrid1.Columns[2].Visibility = System.Windows.Visibility.Collapsed;
}

private void Show_Click(object sender, RoutedEventArgs e)
{
dataGrid1.Columns[2].Visibility = System.Windows.Visibility.Visible;
}

private void SetTextBlocks_Click(object sender, RoutedEventArgs e)
{
TextBlock temp = new TextBlock();
temp.Text = "ID X";
dataGrid1.Columns[0].Header = temp;

temp = new TextBlock();
temp.Text = "Name X";
dataGrid1.Columns[1].Header = temp;

temp = new TextBlock();
temp.Text = "Weight X";
dataGrid1.Columns[2].Header = temp;
}
}
}
"