You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForms项目迁移WPF时DataGrid添加按钮列触发DisplayIndex错误咨询

问题排查

你编写的WPF代码存在结构错误,是触发DisplayIndex异常的直接原因:DataGridTemplateColumn不能直接作为DataGrid的子元素,必须包裹在<DataGrid.Columns>节点中。

修正后的XAML代码(和原WinForms功能对齐)

<Grid ShowGridLines="True">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="560"/>
        <ColumnDefinition Width="425" />
        <ColumnDefinition Width="560" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="156" />
        <RowDefinition Height="55.2" />
        <RowDefinition Height="89.6"/>
        <RowDefinition Height="332.8"/>
        <RowDefinition Height="217.6"/>
        <RowDefinition Height="1" />
        <RowDefinition Height="1" />
    </Grid.RowDefinitions>
    <DataGrid x:Name="dgSlijpMachine" Grid.Row="2" Grid.Column="1" AutoGenerateColumns="True">
        <!-- 列必须放在Columns集合内 -->
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="del" Width="30">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button x:Name="btnDel" Content="X" Click="btnDel_Click"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

注意:如果不需要自动生成绑定数据源的其他列,可以把AutoGenerateColumns设为False

按钮点击事件参考实现(VB.NET后台)

Private Sub btnDel_Click(sender As Object, e As RoutedEventArgs)
    ' 获取当前按钮所在行的绑定数据,替换为你实际的业务类类型即可
    Dim rowData = CType(CType(sender, Button).DataContext, 你的数据类类型)
    ' 执行对应删除逻辑
End Sub

后台动态添加列方案(和原WinForms逻辑更接近)

如果你需要和原WinForms一样用后台代码动态添加按钮列,可以用以下VB.NET代码:

Dim btnCol As New DataGridTemplateColumn()
btnCol.Header = "del"
btnCol.Width = 30
' 构造按钮模板
Dim factory As New FrameworkElementFactory(GetType(Button))
factory.SetValue(Button.ContentProperty, "X")
factory.AddHandler(Button.ClickEvent, New RoutedEventHandler(AddressOf btnDel_Click))
Dim cellTemplate As New DataTemplate()
cellTemplate.VisualTree = factory
btnCol.CellTemplate = cellTemplate
' 添加到DataGrid列集合
dgSlijpMachine.Columns.Add(btnCol)

以上实现的功能和你原WinForms版本完全一致,不会再触发DisplayIndex异常。

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:54:02