如何将 DataTable 中的行添加到已在 vb.net 中填充数据的 DataGridView

How to Add Rows from DataTable to DataGridView That Is Already Populated Data in vb.net

提问人:dlaksmi 提问时间:9/8/2023 最后编辑:dlaksmi 更新时间:9/11/2023 访问量:45

问:

我试过它没有用,因此它没有在 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

VIEW

vb.net DataTable DataGridView Dapper

评论

0赞 jmcilhinney 9/8/2023
你描述一下实际问题怎么样?如果你不解释你实际期望什么以及发生的事情与此有何不同,那么仅仅说它不起作用就没有什么价值。请访问帮助中心,了解如何正确提问。
0赞 jmcilhinney 9/8/2023
为什么您会看到 DataSource 两次?网格将显示您提供的列表中的任何内容。如果分配第二个列表,它将完全替换第一个列表。如果希望添加而不是替换,则需要添加到已绑定的列表中。
0赞 dlaksmi 9/9/2023
@jmcilhinney,感谢您的回复。 抱歉,我没有告诉您问题,现在我已经更新了描述,它没有在 DataGridView 中添加行How about you describe the actual problem?
0赞 dlaksmi 9/9/2023
@jmcilhinney,你是对的,我应该按照第一个使用我的源一次。请指导我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.
0赞 jmcilhinney 9/9/2023
创建一个列表,将其绑定到网格,然后对该列表进行更改。就是这样,仅此而已。如果希望该列表是 DataTable,请使用 DataTable。如果你想让它成为别的东西,那就用晚餐时间。我们不知道您的服务方法返回了什么,因为您没有告诉我们。您的问题仍然缺乏重要的细节。

答:

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