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

