【问题标题】:How can i convert a datatable into an object in vb.net?如何将数据表转换为 vb.net 中的对象?
【发布时间】:2021-11-11 08:45:02
【问题描述】:

我有两个 DataTable(dt1 和 dt2),我想将它们转换为一个类的对象(data1 和 data2),所以我可以使用 compareTo 方法将其放入绑定列表中。

Public Class MainForm

    Public dt1, dt2 As DataTable
    Public data1, data2 As ISAACService
    Private Sub btnDatei1_Click(sender As Object, e As EventArgs) Handles btnDatei1.Click
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            If File.Exists(OpenFileDialog1.FileName) Then
                dt1 = FileGenerator.ReadFromProtectedFile(OpenFileDialog1.FileName)
                dgv1.DataSource = dt1
            End If
        End If
    End Sub

    Private Sub btnVergleich_Click(sender As Object, e As EventArgs) Handles btnVergleich.Click
        CompareDataTables()
    End Sub




    Private Sub btnDatei2_Click(sender As Object, e As EventArgs) Handles btnDatei2.Click
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            dt2 = FileGenerator.ReadFromProtectedFile(OpenFileDialog1.FileName)
            dgv2.DataSource = dt2
        End If
    End Sub

    Private Sub CompareDataTables()
        data1 = CType(dt1, ISAACService)
        For i = 0 To dt1.Rows.Count - 1
            If i < dt2.Rows.Count Then
                Dim row1 = dt1.Rows(i)
                Dim row2 = dt2.Rows(i)
                data1.CompareTo(data2)
                '
            End If
        Next
    End Sub
End Class

compareTo 方法:

Public Function CompareTo(other As ISAACService) As Integer Implements IComparable(Of ISAACService).CompareTo

        If other.GetType() Is GetType(ISAACService) Then
            other = CType(other, ISAACService)

            If Me.UANR > other.UANR Then
                Return 1
            ElseIf Me.UANR < other.UANR Then
                Return -1
            Else
                Return 0
            End If
        End If
        Return 0

    End Function

对象的类:

Public MustInherit Class ISAACServiceBase


    ReadOnly Property KostenArt As String
    ReadOnly Property UANR As String
    ReadOnly Property Überbegriff As String
    ReadOnly Property Benennung As String
    ReadOnly Property Anzahl As Double
    ReadOnly Property Einheit As String
    ReadOnly Property Einzelkosten As Double
    ReadOnly Property Gesamtmenge As Integer
    ReadOnly Property Z As String

    Public Sub New()

    End Sub

    Public Sub New(kArt As String, uNR As String, üBegriff As String, bnung As String, anzl As Double, enht As String, eKosten As Double, gMenge As Integer, zz As String)
        KostenArt = kArt
        UANR = uNR
        Überbegriff = üBegriff
        Benennung = bnung
        Anzahl = anzl
        Einheit = enht
        Einzelkosten = eKosten
        Gesamtmenge = gMenge
        Z = zz
    End Sub

End Class

如果您需要任何进一步的信息,请告诉我。感谢您的帮助!

【问题讨论】:

  • 你不能神奇地将一种类型的对象变成另一种类型的对象。为了使CType 工作,DataTable 类中必须有代码来创建ISAACService 类型的对象,用来自DataTable 的数据填充它,然后返回它。没有这样的代码,因此您必须编写自己的方法,将DataTable 作为输入,创建并填充ISAACService,然后返回它。
  • 另外,鉴于DataTable 通常包含多个DataRows,您确定生成单个ISAACService 对象有意义吗?它实际上应该是此类对象的数组或集合吗?每行一个?
  • @jmcilhinney 不,这没有意义,你是对的,你能告诉我如何使用 DataTable 中的数据填充 ISAAC 服务吗?我应该使用构造函数吗?
  • 创建一个实例并设置属性,就像对任何其他对象一样。如果需要,您可以添加带参数的构造函数,但您知道该类型是什么以及做什么,因此您需要决定这样做是否有意义。
  • @jmcilhinney 但我需要为每一行创建一个实例,对吗?当我使用 for each 循环执行此操作时,如何管理每个实例都有不同的名称?

标签: vb.net visual-studio


【解决方案1】:

这是一个进行转换的函数。当然,我不知道DataTable 字段是否与类的属性一致。您可能需要更改 row 的字段索引。

Private Function CovertDataTableToListOfISAACService(dt As DataTable) As List(Of ISAACService)
    Dim lst As New List(Of ISAACService)
    For Each row As DataRow In dt.Rows
        Dim ISAAC As New ISAACService(row(0).ToString, row(1).ToString, row(2).ToString, row(3).ToString, CDbl(row(4)), row(5).ToString, CDbl(row(6)), CInt(row(7)), row(8).ToString)
        lst.Add(ISAAC)
    Next
    Return lst
End Function

您的比较函数开始验证other 的类型。 other 已经保证为ISAACService,因为这是参数的类型。我不确定您将其他与什么进行比较,但这不是问题所要问的。

【讨论】:

  • 我只是用“其他”验证了它,因为我从 java 中就知道它。我想比较数据表是否相同,如果添加/删除/修改了某些内容,我将所有内容都放在超网格中并突出显示更改。谢谢你的回答,对我帮助很大。
  • @idontgetit 看来我已经回答了你的问题。请点击我的答案左侧的复选标记(勾号)接受我的答案。这将有助于未来的读者,给我一些代表并给你几点。
猜你喜欢
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多