eugz
eugz

Reputation: 39

populate DataGrid when TabItem selected

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

Answers (1)

tontonsevilla
tontonsevilla

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.

OUTPUT 1:
Output 1
OUTPUT 2:
enter image description here

I hope it helps. Happy coding.

Upvotes: 0

Related Questions