放置在 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 个 tabitems 的 tabcontrol 的 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
移动到第二个DataGrid
的AutoGeneratedColumns
事件处理程序:
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 中,它工作正常)的主要内容,如果未能解决你的问题,请参考以下文章
根据子列表中的第二个元素按字母顺序对列表进行排序,但不区分大小写[重复]