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

VB.Net WPF中动态创建用户定义尺寸的可编辑表格求助

解决WPF动态尺寸可编辑表格的问题

嘿,我完全懂你遇到的麻烦——WinForms的DataGridView思路在WPF里行不通,DataGrid和RadGridView的动态列处理确实需要换个思路。下面给你几个靠谱的解决方案,从原生WPF到Telerik的都有:

方案1:原生DataGrid + DataTable(修复你的原有思路)

你之前用Me.DataGridTableau.ItemsSource = dt没生效,大概率是没做好这几点:

  • 确保DataGrid开启了自动生成列:AutoGenerateColumns="True"
  • 正确创建对应尺寸的DataTable(包含指定行数和列数)
  • 给DataTable的列设置可编辑的类型(比如string)

示例代码(VB.NET,适配你的Me用法):

' 先根据用户选择的尺寸创建DataTable
Dim gridSize As Integer = 10 ' 这里替换成用户选择的10/20/30
Dim dt As New DataTable()

' 添加列
For colIndex As Integer = 1 To gridSize
    dt.Columns.Add($"列{colIndex}", GetType(String))
Next

' 添加行
For rowIndex As Integer = 1 To gridSize
    Dim newRow As DataRow = dt.NewRow()
    ' 可以给单元格设置默认值,或者留空
    For colIndex As Integer = 0 To gridSize - 1
        newRow(colIndex) = ""
    Next
    dt.Rows.Add(newRow)
Next

' 绑定到DataGrid,记得XAML里DataGrid的AutoGenerateColumns设为True
DataGridTableau.ItemsSource = dt.DefaultView

注意:用DefaultView而不是直接绑定DataTable,WPF对DataView的支持更好,默认就支持编辑。另外要确保DataGrid的IsReadOnly设为False,这样单元格才能编辑。

方案2:原生DataGrid + 动态对象(无需DataTable)

如果不想用DataTable,可以用ExpandoObject创建动态行,配合动态生成列的方式,灵活性更高:

后台代码:

Dim gridSize As Integer = 20
Dim rows As New ObservableCollection(Of ExpandoObject)()

' 创建动态行
For rowIndex As Integer = 0 To gridSize - 1
    Dim row As New ExpandoObject()
    Dim rowDict = row As IDictionary(Of String, Object)
    ' 给每行添加对应列的属性
    For colIndex As Integer = 1 To gridSize
        rowDict.Add($"列{colIndex}", "")
    Next
    rows.Add(row)
Next

' 动态生成DataGrid的列
DataGridTableau.Columns.Clear()
For colIndex As Integer = 1 To gridSize
    Dim col As New DataGridTextColumn()
    col.Header = $"列{colIndex}"
    col.Binding = New Binding($"列{colIndex}") With {.Mode = BindingMode.TwoWay}
    DataGridTableau.Columns.Add(col)
Next

DataGridTableau.ItemsSource = rows

XAML里的DataGrid设置:

<DataGrid x:Name="DataGridTableau" IsReadOnly="False" AutoGenerateColumns="False"/>

这种方式完全摆脱了DataTable,还能自定义列的样式,更适合复杂场景。

方案3:Telerik RadGridView的动态列解决方案

你说RadGridView没法处理未知列数,其实可以通过动态生成列 + 用Dictionary存储行数据来解决:

后台代码:

Dim gridSize As Integer = 30
Dim rows As New ObservableCollection(Of Dictionary(Of String, Object))()

' 创建行数据,每个Dictionary对应一行,键是列名
For rowIndex As Integer = 0 To gridSize - 1
    Dim rowDict As New Dictionary(Of String, Object)()
    For colIndex As Integer = 1 To gridSize
        rowDict.Add($"列{colIndex}", "")
    Next
    rows.Add(rowDict)
Next

' 动态生成RadGridView的列
RadGridViewTableau.Columns.Clear()
For colIndex As Integer = 1 To gridSize
    Dim col As New GridViewDataColumn()
    col.Header = $"列{colIndex}"
    ' 绑定到Dictionary的键,注意用索引器语法
    col.DataMemberBinding = New Binding($"[{\"列" & colIndex & "\"}]") With {.Mode = BindingMode.TwoWay}
    RadGridViewTableau.Columns.Add(col)
Next

RadGridViewTableau.ItemsSource = rows

这样不管列数是10、20还是30,都能动态生成对应的列,而且每个单元格都是可编辑的——双向绑定会确保编辑后的数据同步到集合里。

最后提醒一下:不管用哪种方案,都要确保控件的IsReadOnly属性设为False,否则单元格没法编辑哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:24:32