Эффективный способ создания таблицы в vb.net

Этот вопрос может показаться очень расплывчатым. То, что я ищу, это способ создания HTML <table></table>,

Мне нужно построить эту таблицу:

Таблица

На самом деле верхняя строка - это заголовок, а первые два столбца - тоже заголовки.

Для каждой ячейки, начиная с (3,2), я выполняю запрос 'count'.

Сейчас я делаю очень уродливый цикл для построения 2D-массива. У меня такое чувство, что должно быть лучше. В ближайшем будущем я должен поставить ссылку под каждым "подсчитанным" целым числом, которое ссылается на другую таблицу для представления строк, связанных с целым числом.

Вот как я делаю это сейчас: я просто зацикливаюсь на различных Dictionaries(Of String,String) генерировать 2D массив. Для построения массивов я использую две переменные, чтобы знать, где в таблице я нахожусь: Dim lv_TRow As Integer = 0 а также Dim lv_TCol As Integer = 0,

Должен быть лучший способ. Может быть, преобразовать их в объекты или что-то я еще не знаю.

Можете ли вы помочь сделать это лучше?

Public Function build2DArray() As String(,)
    Dim lv_Tabel(15, 4) As String


    Dim riskLevels As New Dictionary(Of String, String) ' Kan gebruikt worden in WHERE
    riskLevels.Add("Extreem", 5)
    riskLevels.Add("Hoog", 4)
    riskLevels.Add("Normaal", 3)
    riskLevels.Add("Laag", 2)
    riskLevels.Add("Gering", 1)

    Dim algStss As New Dictionary(Of String, String)
    algStss.Add("Gestart", 0)
    algStss.Add("Geanalyseerd", 0)
    algStss.Add("Opgelost", 0)

    Dim incStss As New Dictionary(Of String, String) ' Kan gebruikt worden in WHERE
    incStss.Add("Gestart", "L14_IncSts IN (1,2)")
    incStss.Add("Geanalyseerd", "L14_IncSts IN (3,4,5,6,7)")
    incStss.Add("Opgelost", "L14_IncSts IN (8)")

    Dim prmStss As New Dictionary(Of String, String) ' Kan gebruikt worden in WHERE
    prmStss.Add("Gestart", "L24_StsIdt IN (1)")
    prmStss.Add("Geanalyseerd", "L24_StsIdt IN (2,3,4,5,6)")
    prmStss.Add("Opgelost", "L24_StsIdt IN (7)")

    Dim wzgStss As New Dictionary(Of String, String) ' Kan gebruikt worden in WHERE
    wzgStss.Add("Gestart", "L38_StsIdt IN (1,2)")
    wzgStss.Add("Geanalyseerd", "L38_StsIdt IN (3,4,5,6,7)")
    wzgStss.Add("Opgelost", "L38_StsIdt IN (8,9,10,11)")

    Dim headers As New Dictionary(Of String, String) ' Kan gebruikt worden in FROM
    headers.Add("Risiconiveau", 0)
    headers.Add("Status", 0)
    headers.Add("Incident", "Inc")
    headers.Add("Probleem", "Prm")
    headers.Add("Wijziging", "Wzg")

    Dim lv_Dtb As New Database
    'lv_Dtb.ExecuteQuery("SELECT * FROM Ris")

    Dim lv_TRow As Integer = 0
    Dim lv_TCol As Integer = 0

    For Each header As KeyValuePair(Of String, String) In headers
        lv_Tabel(lv_TRow, lv_TCol) = header.Key
        lv_TCol += 1
    Next

    lv_TCol = 0
    lv_TRow = 1

    For Each riskLevel As KeyValuePair(Of String, String) In riskLevels
        lv_Tabel(lv_TRow + 1, lv_TCol) = riskLevel.Key
        lv_TCol += 1

        For Each algSts As KeyValuePair(Of String, String) In algStss
            lv_Tabel(lv_TRow, lv_TCol) = algSts.Key
            lv_TRow += 1
        Next
        lv_TRow -= 3
        lv_TCol += 1

        For Each incSts As KeyValuePair(Of String, String) In incStss
            Try
                Dim dataset As DataSet = lv_Dtb.ExecuteQuery(QryString(1, incSts.Value, riskLevel.Value))
                lv_Tabel(lv_TRow, lv_TCol) = dataset.Tables(0).Rows(0).Item(0) 'eerste query
            Catch err As SqlException
                Logger.Log(err.Message)
                lv_Tabel(lv_TRow, lv_TCol) = "err"
            End Try
            lv_TRow += 1
        Next
        lv_TRow -= 3
        lv_TCol += 1

        For Each prmSts As KeyValuePair(Of String, String) In prmStss
            Try
                Dim dataset As DataSet = lv_Dtb.ExecuteQuery(QryString(2, prmSts.Value, riskLevel.Value))
                lv_Tabel(lv_TRow, lv_TCol) = dataset.Tables(0).Rows(0).Item(0) 'eerste query
            Catch err As SqlException
                Logger.Log(err.Message)
                lv_Tabel(lv_TRow, lv_TCol) = "err"
            End Try
            lv_TRow += 1
        Next
        lv_TRow -= 3
        lv_TCol += 1

        For Each wzgSts As KeyValuePair(Of String, String) In wzgStss
            Try
                Dim dataset As DataSet = lv_Dtb.ExecuteQuery(QryString(3, wzgSts.Value, riskLevel.Value))
                lv_Tabel(lv_TRow, lv_TCol) = dataset.Tables(0).Rows(0).Item(0) 'eerste query
            Catch err As SqlException
                Logger.Log(err.Message)
                lv_Tabel(lv_TRow, lv_TCol) = "err"
            End Try
            lv_TRow += 1
        Next

        lv_TCol -= 4
    Next

    lv_Dtb.CloseConnection()

    Return lv_Tabel
End Function

1 ответ

Используйте Datatable

 Dim dtb As New DataTable
 dtb.Columns.Add("Risiconiveau", GetType(String))
 dtb.Columns.Add("Status", GetType(String))
 dtb.Columns.Add("Incident", GetType(Integer))
 dtb.Columns.Add("Probleem", GetType(Integer))
 dtb.Columns.Add("Wijziging", GetType(Integer))

 dtb.Rows.Add("Extreem", "Geanalyseerd", 0, 0, 0)
 dtb.Rows.Add("Extreem", "Opgelost", 0, 0, 0)
 dtb.Rows.Add("Extreem", "Gestart", 0, 0, 0)

 For Each drw As DataRow In dtb.Rows
   If CStr(drw("Risiconiveau")) = "Extreem" And CInt(drw("Incident")) = 0 Then
     drw("Opgelost") = CInt(drw("Opgelost")) + 1
   End If

 Next drw
 dtb.Dispose()
Другие вопросы по тегам