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

VB.NET中如何向已有数据的DataGridView添加DataTable行?代码失效求助

问题排查与解决

核心问题:数据源不匹配

你当前的DataGridView绑定的是GetPersondetailbyinvono返回的实体集合,但点击按钮时是往独立的dt数据表中添加行,两者没有关联,所以DataGridView不会刷新显示新行。

修正方案

步骤1:统一数据源为DataTable

修改构造函数,将数据库查询结果转换为DataTable,绑定到DataGridView同时赋值给dt,确保后续操作的是同一个数据源:

Public Sub New(invono As personmaster)
    Me.New()
    ' 将查询结果转换为DataTable
    Dim personList = pservice.GetPersondetailbyinvono(invono.Invono)
    dt = ToDataTable(personList)
    ' 如果dt为空,手动添加列(避免无数据时列不显示)
    If dt.Columns.Count = 0 Then
        dt.Columns.AddRange({
            New DataColumn("ID", GetType(Integer)),
            New DataColumn("Invono", GetType(String)),
            New DataColumn("NamePerson", GetType(String)),
            New DataColumn("Age", GetType(Integer)),
            New DataColumn("Job", GetType(String))
        })
    End If
    DataGridView1.DataSource = dt
    TextBox1.Text = invono.Invono
End Sub

' 辅助方法:将实体集合转换为DataTable
Private Function ToDataTable(Of T)(data As IEnumerable(Of T)) As DataTable
    Dim props = GetType(T).GetProperties()
    Dim dt = New DataTable()
    For Each prop In props
        dt.Columns.Add(prop.Name, prop.PropertyType)
    Next
    For Each item In data
        Dim row = dt.NewRow()
        For Each prop In props
            row(prop.Name) = prop.GetValue(item)
        Next
        dt.Rows.Add(row)
    Next
    Return dt
End Function

步骤2:修复按钮添加行的类型问题

Age是Integer类型,直接传入txtAge.Text会导致类型不匹配,需要先转换:

Private Sub BTNADD_Click(sender As Object, e As EventArgs) Handles BTNADD.Click
    ' 验证输入合法性(可选但推荐)
    If Not Integer.TryParse(txtAge.Text, Dim age) Then
        MessageBox.Show("年龄必须是整数")
        Return
    End If
    ' 添加行到绑定的dt中,DataGridView会自动刷新
    dt.Rows.Add(dt.Rows.Count + 1, txtInvono.Text, txtNameperson.Text, age, txtJob.Text)
End Sub

步骤3:修复SQL注入风险

当前的SQL语句使用字符串拼接,存在严重的SQL注入漏洞,改用参数化查询:

Public Function GetPersondetailbyinvono(ByVal Invno As String) As IEnumerable(Of persondetail)
    Dim sql = "SELECT * FROM PersonDetail WHERE Invono = @Invono"
    Using _conn = New OleDbConnection(GetOledbConnectionString())
        Return _conn.Query(Of persondetail)(sql, New With {.Invono = Invno}).ToList()
    End Using
End Function

额外注意事项

  • 确保persondetail实体的属性名称与数据库表字段完全一致,否则转换DataTable时会出现列不匹配
  • 如果使用的是.NET Framework,可直接使用DataTable.Load方法读取数据,无需手动转换实体集合

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:52:54