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

