简体   繁体   English

选择 TabItem 时填充 DataGrid

[英]populate DataGrid when TabItem selected

The WPF form has TabControl with three TabItems. WPF 表单具有带有三个 TabItem 的 TabControl。 Each TabItem contains DataGrid.每个 TabItem 都包含 DataGrid。 And I would like to populate DataGrid in case if according TabItem selected.如果选择了 TabItem,我想填充 DataGrid。

C# 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.'当我运行应用程序时,我收到错误消息: System.NullReferenceException: '对象引用未设置为 object 的实例。 dataGrid was null.数据网格是null The execution stop on line: dataGrid.ItemsSource = employees;在线执行停止:dataGrid.ItemsSource = employees;

XAML 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.谢谢。

To achieved it filling of the datagrid must be inside of this event TabControl_SelectionChanged.要实现它,数据网格的填充必须在此事件 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 .我使用了 GetChildOfType 方法来更轻松地获取控件,您可以在此答案上进行检查。

OUTPUT 1: OUTPUT 1:
输出 1
OUTPUT 2: OUTPUT 2:
在此处输入图像描述

I hope it helps.我希望它有所帮助。 Happy coding.快乐编码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM