VB.NET中DataGridView绑定报错:列已存在,如何正确绑定?
VB.NET DataGridView数据绑定问题排查与修复
错误原因
- 重复添加DataTable列:
FillDataTable方法每次执行都会给_myTable添加No和Codeproduct列,第一次调用正常,第二次调用时同名列已存在,触发“A column named [column name] already belongs to this DataTable”异常。 - 冗余数据源绑定:每次添加行后重复设置
Grid.DataSource = _myTable,DataGridView绑定DataTable后,DataTable的变更会自动同步到控件,无需重复赋值。 - 无效代码干扰:
LoadData方法创建了List(Of item())(item数组的集合),但后续并未使用该集合作为数据源,属于无效逻辑。 - 行号计算依赖控件风险:通过DataGridView行数据计算行号,若控件为空或行数据异常,会引发转换错误。
修复步骤
- 提前初始化DataTable列:在Form加载时一次性创建DataTable的列,避免重复添加。
- 简化行号计算:直接通过
_myTable.Rows.Count + 1获取新行号,无需依赖控件数据。 - 仅绑定一次数据源:Form加载时完成DataGridView与DataTable的绑定,后续添加行后无需重复设置。
- 清理无效代码:移除
LoadData里的无用逻辑,或按需调整为初始化空数据的逻辑。
修正后的完整代码
Public Class Form1 Private _myTable As New DataTable() Private Sub FillDataTable(iRow As Integer, ByVal Codeproduct As String) ' 仅添加行,不再重复添加列 Dim row As DataRow = _myTable.NewRow() row("No") = iRow row("Codeproduct") = Codeproduct _myTable.Rows.Add(row) End Sub Private Sub AddColumnsProgrammatically() Dim Col1 = New DataGridViewTextBoxColumn() Dim Col2 = New DataGridViewTextBoxColumn() Col1.HeaderText = "No" Col1.Name = "Column1" Col1.DataPropertyName = "No" Col2.HeaderText = "CodeProduct" Col2.Name = "Column2" Col2.DataPropertyName = "Codeproduct" ' 注意与DataTable列名一致 Grid.Columns.AddRange(New DataGridViewColumn() {Col1, Col2}) End Sub Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load AddColumnsProgrammatically() ' 初始化DataTable的列 _myTable.Columns.Add("No", GetType(Integer)) _myTable.Columns.Add("Codeproduct", GetType(String)) ' 仅绑定一次数据源 Grid.DataSource = _myTable End Sub Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Enter) Then ' 通过DataTable行数计算新行号,更可靠 Dim iRow As Integer = _myTable.Rows.Count + 1 FillDataTable(iRow, TextBox1.Text) TextBox1.Clear() End If End Sub End Class Public Class DataControl Public Shared Function CreateDataTableDynamic(ByVal field() As String) As DataTable Dim i As Integer Dim dtTable As New DataTable("MyTable") For i = 0 To field.GetUpperBound(0) dtTable.Columns.Add(New DataColumn(field(i))) Next i Return dtTable End Function End Class Public Class item Public Property No() As Integer Public Property CodeProduct() As String End Class
额外说明
- 注意DataGridView列的
DataPropertyName必须与DataTable的列名完全一致(区分大小写),否则无法正确绑定数据。 - 如果需要初始显示空行,可以保留
LoadData方法并调整为添加空行到DataTable,而非创建无用的列表集合。
内容的提问来源于stack exchange,提问作者roy
相关产品推荐
相关产品推荐

