放置在 tabcontrol 的第二个 tabitem 中的数据网格的 WPF-'Index out of Range' 错误(但如果放置在第一个 tabitem 中,它工作正常)

Posted

技术标签:

【中文标题】放置在 tabcontrol 的第二个 tabitem 中的数据网格的 WPF-\'Index out of Range\' 错误(但如果放置在第一个 tabitem 中,它工作正常)【英文标题】:WPF-'Index out of Range' error for a datagrid which is placed in the second tabitem of tabcontrol (but it works fine if placed in first tabitem)放置在 tabcontrol 的第二个 tabitem 中的数据网格的 WPF-'Index out of Range' 错误(但如果放置在第一个 tabitem 中,它工作正常) 【发布时间】:2021-11-03 03:52:40 【问题描述】:

所以我有一个带有 4 个 tabitemstabcontrol 的 WPF 窗口。

当在 first 选项卡项中放置数据网格并绑定到数据表时,它可以正常工作,如下所示:

 private void LoadServices()
    
        if (serviceData.GetAllServices(currentID) != null)
        
            dataGridServices.ItemsSource = serviceData.GetAllServices(currentID).DefaultView;
            dataGridServices.Columns[0].Visibility = Visibility.Hidden;
        
    

(顺便说一句,我在 Window_ContentRendered 事件中调用了上面的方法,它工作正常)。

然后我在 second tabitem 中添加另一个数据网格,代码完全相同,但现在我在下面的行中收到错误:“索引超出范围。必须为非负数并且小于集合的大小。(参数'index')'":

dataGridServices.Columns[0].Visibility = Visibility.Hidden;

调试并悬停在 ItemSource 属性上时,我可以看到那里有三列,那么它怎么会超出范围?顺便说一下,绑定第二个数据网格的方法和上面一样,我也是从 Window_ContentRendered 事件中调用的。

(需要明确的是,当我不隐藏特定列时,数据也可以使用存储过程中定义的列名很好地加载)

数据网格和选项卡控件在 WPF 中协同工作的方式有什么独特之处吗?

最新代码:

XAML:

 <TabControl x:Name="tabControl">
            <TabItem  x:Name="FirstTabItem" Header="First">
                <DataGrid  x:Name="datagridServicesFirstTab">
                </DataGrid>
            </TabItem>
            <TabItem  x:Name="SecondTabItem" Header="Second">
                <DataGrid  x:Name="datagridServices" AutoGeneratedColumns="OnLoaded" >
                </DataGrid>
            </TabItem>
        </TabControl>

事件处理方法:

private void OnLoaded(object sender, EventArgs e)
    
        LoadServices();
    

数据方法:

private void LoadServices()
    
        if (serviceData.GetAllServices(currentID) != null)
        
            datagridServices.ItemsSource = serviceData.GetAllServices(currentID).DefaultView;
            datagridServices.Columns[0].Visibility = Visibility.Hidden;
        
    

【问题讨论】:

您是明确创建列还是指定 AutoGenerateColumns? @KlausGütter 对于两个数据网格,'AutoGenerateColumns' 设置为 true 我不确定,但很可能只有在数据网格可见时才会生成列,即第二个选项卡激活后,第二个选项卡上的列才会生成。 【参考方案1】:

在调试并悬停在 ItemSource 属性上时,我可以看到那里有三列,那么它怎么会超出范围?

可能是因为DataGrid 的列尚未生成。在您选择该选项卡之前,不会呈现选项卡项的内容。

将您的代码从Window_ContentRenderer 移动到第二个DataGridAutoGeneratedColumns 事件处理程序:

private void OnLoaded(object sender, EventArgs e)

    LoadServices();

XAML:

<TabItem Header="second...">
    <DataGrid ... AutoGeneratedColumns="OnLoaded" />

【讨论】:

不幸的是,这也不起作用,我得到相同的“索引超出范围”错误 所以试试AutoGeneratedColumns吧。看我的回答。引发此事件时,应该有一些列。 'AutoGeneratedColumns' 事件不会触发(同样是因为它位于第二个选项卡上)。当我将相同的事件附加到第一个选项卡上的数据网格时,它成功触发 您选择了第二个标签吗?在您执行此操作之前,它不会触发... 您需要意识到在DataGrid 实际显示之前没有列。

以上是关于放置在 tabcontrol 的第二个 tabitem 中的数据网格的 WPF-'Index out of Range' 错误(但如果放置在第一个 tabitem 中,它工作正常)的主要内容,如果未能解决你的问题,请参考以下文章

根据子列表中的第二个元素按字母顺序对列表进行排序,但不区分大小写[重复]

第一个视图中的 UISwitch 和第二个视图中的标签

强制 TabController 创建所有选项卡 Flutter

C# WinForm怎么用程序切换tabcontrol?

加载第二个模型时,第一个模型的属性会被删除

为啥我的第二个视图在转换后没有加载?