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
相关产品推荐
相关产品推荐

