Reputation: 39
The WPF form has TabControl with three TabItems. Each TabItem contains DataGrid. And I would like to populate DataGrid in case if according TabItem selected.
C#
private void Window_Loaded(object sender, RoutedEventArgs e)
{
SetA_DG();
}
public void SetA_DG()
{
var sourcea UIAdapter.GetSourceA();
DataGrid_A.ItemsSource = sourcea;
}
public void SetB_DG()
{
var sourceb UIAdapter.GetSourceB();
DataGrid_B.ItemsSource = sourceb;
}
public void SetC_DG()
{
var sourcec UIAdapter.GetSourceC();
DataGrid_C.ItemsSource = sourcec;
}
private void ABC_TC_SelectionChenged(object sender, SelectionChangedEventArgs e)
//{
//var sTabItem = ABC_TC.SelectedItem as TabItem;
//switch (sTabItem.Name)
//{
//case "A_TI":
//SetA_DG();
//break;
//case "B_TI":
//SetB_DG();
//break;
//case "C_TI":
//SetC_DG();
//break;
//}
{
var employees = GetEmployees();
TabControl tabControl = (TabControl)sender;
var selectedIndex = tabControl.SelectedIndex;
TabItem tabItem = (TabItem)tabControl.SelectedItem;
Grid grid = (Grid)tabItem.Content;
var dataGrid = grid.GetChildOfType<DataGrid>();
dataGrid.ItemsSource = employees;
}
}
When I run application I get error message: System.NullReferenceException: 'Object reference not set to an instance of a object.' dataGrid was null. The execution stop on line: dataGrid.ItemsSource = employees;
XAML
` <TabControl x:Name="ABC_TC" TabStripPlacement="Top" BorderThickness="0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" SelectionChanged="ABC_TC_SelectionChanged">
<TabItem x:Name="A_TI" IsSelected="True" Header="AAA" >
<DataGrid Name="A_DG" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" Width="250" SortMemberPath="Name" IsReadOnly="True"/>
<DataGridTextColumn Header="Description" Binding="{Binding Path=Description}" Width="250" SortMemberPath="Description" IsReadOnly="True"/>
<DataGridTextColumn Header="Active" Binding="{Binding Path=IsActive}" Width="50" SortMemberPath="IsActive" IsReadOnly="True"/>
<DataGridTextColumn Header="Created On" Binding="{Binding Path=CreatedOn, StringFormat='{}{0:MM/dd/yyyy}'}" Width="110" SortMemberPath="CreatedOn" IsReadOnly="True"/>
<DataGridTextColumn Header="Created By" Binding="{Binding Path=CreatedBy}" Width="100" SortMemberPath="CreatedBy" IsReadOnly="True"/>
<DataGridTextColumn Header="Updated On" Binding="{Binding Path=UpdatedOn, StringFormat='{}{0:MM/dd/yyyy}'}" Width="110" SortMemberPath="UpdatedOn" IsReadOnly="True"/>
<DataGridTextColumn Header="Updated By" Binding="{Binding Path=UpdatedBy}" Width="100" SortMemberPath="UpdatedBy" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
</TabItem>
<TabItem x:Name="B_TI" IsSelected="True" Header="BBB" >
<DataGrid Name="B_DG" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" Width="250" SortMemberPath="Name" IsReadOnly="True"/>
<DataGridTextColumn Header="Email" Binding="{Binding Path=Email}" Width="250" SortMemberPath="Email" IsReadOnly="True"/>
<DataGridTextColumn Header="Created On" Binding="{Binding Path=CreatedOn, StringFormat='{}{0:MM/dd/yyyy}'}" Width="110" SortMemberPath="CreatedOn" IsReadOnly="True"/>
<DataGridTextColumn Header="Created By" Binding="{Binding Path=CreatedBy}" Width="100" SortMemberPath="CreatedBy" IsReadOnly="True"/>
<DataGridTextColumn Header="Updated On" Binding="{Binding Path=UpdatedOn, StringFormat='{}{0:MM/dd/yyyy}'}" Width="110" SortMemberPath="UpdatedOn" IsReadOnly="True"/>
<DataGridTextColumn Header="Updated By" Binding="{Binding Path=UpdatedBy}" Width="100" SortMemberPath="UpdatedBy" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
</TabItem>
<TabItem x:Name="C_TI" IsSelected="True" Header="CCC" >
<DataGrid Name="C_DG" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" Width="250" SortMemberPath="Name" IsReadOnly="True"/>
<DataGridTextColumn Header="IsActive" Binding="{Binding Path=IsActive}" Width="50" SortMemberPath="Isactive" IsReadOnly="True"/>
<DataGridTextColumn Header="Created On" Binding="{Binding Path=CreatedOn, StringFormat='{}{0:MM/dd/yyyy}'}" Width="110" SortMemberPath="CreatedOn" IsReadOnly="True"/>
<DataGridTextColumn Header="Created By" Binding="{Binding Path=CreatedBy}" Width="100" SortMemberPath="CreatedBy" IsReadOnly="True"/>
<DataGridTextColumn Header="Updated On" Binding="{Binding Path=UpdatedOn, StringFormat='{}{0:MM/dd/yyyy}'}" Width="110" SortMemberPath="UpdatedOn" IsReadOnly="True"/>
<DataGridTextColumn Header="Updated By" Binding="{Binding Path=UpdatedBy}" Width="100" SortMemberPath="UpdatedBy" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
</TabItem>
</TabControl>
`
How to fix the problem?
Thanks.
Upvotes: 1
Views: 106
Reputation: 2809
To achieved it filling of the datagrid must be inside of this event TabControl_SelectionChanged.
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var productList = getProductList();
TabControl tabControl = (TabControl)sender;
var selectedIndex = tabControl.SelectedIndex;
TabItem tabItem = (TabItem)tabControl.SelectedItem;
Grid grid = (Grid)tabItem.Content;
var dataGrid = grid.GetChildOfType<DataGrid>();
dataGrid.ItemsSource = productList;
}
I used a GetChildOfType method for easier getting of the control you can check it on this answer.
I hope it helps. Happy coding.
Upvotes: 0