提问人:dlaksmi 提问时间:9/8/2023 最后编辑:dlaksmi 更新时间:9/11/2023 访问量:45
如何将 DataTable 中的行添加到已在 vb.net 中填充数据的 DataGridView
How to Add Rows from DataTable to DataGridView That Is Already Populated Data in vb.net
问:
我试过它没有用,因此它没有在 DataGridView 中添加行,请指导我。我应用的代码有问题吗请指导
谢谢
下面是我使用的代码
Dim pservice As New personService
Public dt As New DataTable()
Public Sub New()
InitializeComponent()
End Sub
Public Sub New(invono As personmaster)
Me.New
DataGridView1.DataSource = pservice.GetPersondetailbyinvono(invono.Invono)
TextBox1.Text = invono.Invono
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 Sub
Private Sub BTNADD_Click(sender As Object, e As EventArgs) Handles BTNADD.Click
dt.Rows.Add(dt.Rows.Count + 1, txtInvono.Text, txtNameperson.Text, txtAge.Text, txtJob.Text)
End Sub
Public Function GetPersondetailbyinvono(ByVal Invno As String) As IEnumerable(Of persondetail)
Dim sql = $"SELECT * FROM PersonDetail WHERE Invono = '{Invno}'"
Using _conn = New OleDbConnection(GetOledbConnectionString())
Return _conn.Query(Of persondetail)(sql).ToList()
End Using
End Function
答:
1赞
dlaksmi
9/11/2023
#1
根据上面的链接,我得到了一个解决方案。
Dim pservice As New personService
Public dt As New DataTable()
Public Sub New()
InitializeComponent()
End Sub
Public Function ToDataTable(Of T)(ByVal items As IEnumerable(Of T)) As DataTable
Dim tb = New DataTable(GetType(T).Name)
Dim props() As PropertyInfo = GetType(T).GetProperties(BindingFlags.Public Or BindingFlags.Instance)
For Each prop In props
tb.Columns.Add(prop.Name, If(Nullable.GetUnderlyingType(prop.PropertyType), prop.PropertyType))
Next prop
For Each item In items
Dim values = New Object(props.Length - 1) {}
For i = 0 To props.Length - 1
values(i) = props(i).GetValue(item, Nothing)
Next i
tb.Rows.Add(values)
Next item
Return tb
End Function
Public Sub New(invono As personmaster)
Me.New
DataGridView1.DataSource = ToDataTable(pservice.GetPersondetailbyinvono(invono.Invono))
TextBox1.Text = invono.Invono
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 Sub
Private Sub BTNADD_Click(sender As Object, e As EventArgs) Handles BTNADD.Click
Dim dt = CType(datagridview1.DataSource, datatable)
dt.Rows.Add(dt.Rows.Count + 1, txtInvono.Text, txtNameperson.Text, txtAge.Text, txtJob.Text)
End Sub
Public Function GetPersondetailbyinvono(ByVal Invno As String) As IEnumerable(Of persondetail)
Dim sql = $"SELECT * FROM PersonDetail WHERE Invono = '{Invno}'"
Using _conn = New OleDbConnection(GetOledbConnectionString())
Return _conn.Query(Of persondetail)(sql).ToList()
End Using
End Function
评论
How about you describe the actual problem?
Why would you be seeing the DataSource twice? The grid will display whatever is in the list you provide. If you assign a second list, it completely replaces the first list. If you expect to add rather than replace, you need to add to the list that is already bound.