Объединить 2 таблицы, добавить первую таблицу в качестве заголовков столбцов для datagridview, затем добавить вторую таблицу в виде строк под заголовками столбцов

#mysql #vb.net #datatable #datagridview #inner-join

#mysql #vb.net #datatable #datagridview #внутреннее соединение

Вопрос:

Я хочу добавить столбцы для ОБЪЕКТОВ, а затем использовать их fac_id, чтобы найти их производство воды из другой таблицы, которая будет отображаться в виде одной строки под заголовками столбцов.

 Do While tableRetrieve.Read = True

table.Columns.Add(tableRetrieve("facility"), Type.GetType("System.String"))

Dim newDate As DateTime = DateTime.ParseExact(dtpFrom.Value, "MM/dd/yyyy h:m:s tt",
  System.Globalization.DateTimeFormatInfo.InvariantInfo)
Dim myDate As String = newDate.ToString("yyyy-MM-dd", System.Globalization.DateTimeFormatInfo.InvariantInfo)

If myDate = tableRetrieve("sentDate") Then

If tableRetrieve("prod_id") = tableRetrieve("fac_id") Then
table.Rows.Add(tableRetrieve("facility_produce"))
End If

End If

Loop
 

Я могу добавить заголовки столбцов, но не удалось в строках.

Ниже приведено изображение выходных данных. Отображаются заголовки столбцов, но объемы производства воды отображаются только в одной строке. Для каждого соответствующего столбца должны быть объемы производства воды на основе prod_id, равного fac_id.

Пример DataGridView

Обновить:

Вот как выглядит мой код сейчас. Это хорошо работает, если есть только одна строка. ошибки отображаются, если есть другая строка.

 Do While tableRetrieve.Read = True

  table.Columns.Add(tableRetrieve("facility"), Type.GetType("System.String"))

  If tableRetrieve("facility_id") = tableRetrieve("fac_id") Then

    newDate = tableRetrieve("sentDate")

    If prevDate = newDate Then

    table.Rows(row)(col) = tableRetrieve("facility_produce")
    prevDate = newDate
    col  = 1

    Else

    If row = 0 Then
    col  = 1
    table.Rows.Add(tableRetrieve("sentDate"))
    table.Rows(row)(col) = tableRetrieve("facility_produce")
    prevDate = newDate
    col  = 1
    Else
    col = 0
    row  = 1
    table.Rows.Add(tableRetrieve("sentDate"))
    table.Rows(row)(col) = tableRetrieve("facility_produce")
    col  = 1
    End If

    End If

  End If

Loop

dgvFacility.DataSource = table 

Ответ №1:

Для каждого цикла вы пишете tableRetrieve("facility_produce") новую строку. Вместо этого вы должны записать ее в следующий столбец.

 Dim col As Integer = 0    
Do While tableRetrieve.Read = True

table.Columns.Add(tableRetrieve("facility"), Type.GetType("System.String"))

Dim newDate As DateTime = DateTime.ParseExact(dtpFrom.Value, "MM/dd/yyyy h:m:s tt",
  System.Globalization.DateTimeFormatInfo.InvariantInfo)
Dim myDate As String = newDate.ToString("yyyy-MM-dd", System.Globalization.DateTimeFormatInfo.InvariantInfo)

If myDate = tableRetrieve("sentDate") Then

If tableRetrieve("prod_id") = tableRetrieve("fac_id") Then
  If col = 0 Then
     table.Rows.Add(tableRetrieve("facility_produce"))
  Else
     table.Rows(0)(col) = tableRetrieve("facility_produce")
  End If
  col  = 1
End If

End If

Loop
 

Комментарии:

1. Большое вам спасибо! Работает как шарм! Я не знал, что вы можете кодировать table.rows подобным образом. Так много поиска в Google, а такого примера кода нет. Ты гений! 🙂

2. Я попытался добавить строки для новых значений, но я получаю сообщение об ошибке, что столбец 1 или 2 или 3 не найден. 🙁 Я также получаю сообщение об ошибке из-за повторяющегося имени столбца.

3. Вы должны добавить столбцы (таблица. Столбцы.Добавить …) только при заполнении первой строки столбцы готовы для всех строк.

4. Я выполнил внутреннее объединение, и я могу добавлять столбцы только после Do while tableRetrieve. Read = True. Могу ли я каким-либо образом добавить столбцы, даже если таблицы были объединены внутри?

5. Я также получаю сообщение об ошибке System. Исключение IndexOutOfRangeException: «Не удается найти столбец 2». когда я пытаюсь добавить оператор if, чтобы проверить, существует ли имя столбца.

Ответ №2:

Прежде всего. Я добавил Dim countColumns As Integer в начале формы, которая будет вызвана позже для подсчета столбцов.

Я вставил countColumns = 1 в ту часть, где я отображаю пустую строку datagridview, но с заголовками столбцов в ней. Там столбцы, зарегистрированные в базе данных, уже подсчитаны. Поэтому я могу использовать его позже, чтобы вызвать количество столбцов.

Затем я разместил table.Columns.Count <= countColumns так, чтобы количество столбцов увеличивалось по мере отображения столбцов, а затем прекратил добавлять столбцы, как только количество столбцов, зарегистрированных в базе данных, стало равным, чтобы избежать ошибок при дублировании.

Это часть моей программы, в которой я отображаю заголовки столбцов и значения строк:

 Try
SQLConnection.Open()
tableRetrieve = sqlCommand.ExecuteReader

table.Columns.Add("Date", Type.GetType("System.String"))

Do While tableRetrieve.Read = True

    If table.Columns.Count <= countColumns Then

        table.Columns.Add(tableRetrieve("facility"), Type.GetType("System.String"))

    End If

    newDate = tableRetrieve("sentDate")


    If prevDate = newDate Then

        table.Rows(row)(col) = tableRetrieve("facility_produce")
        prevDate = newDate
        col  = 1

    Else

        If col = 0 Then

            col  = 1
            table.Rows.Add(tableRetrieve("sentDate"))
            table.Rows(row)(col) = tableRetrieve("facility_produce")
            prevDate = newDate
            col  = 1

        Else

            col = 1
            row  = 1
            table.Rows.Add(tableRetrieve("sentDate"))
            table.Rows(row)(col) = tableRetrieve("facility_produce")
            prevDate = newDate
            col  = 1

        End If

    End If

Loop

dgvFacility.DataSource = table
tableRetrieve.Close()
sqlCommand.ExecuteNonQuery()
Catch ex As MySqlException
MsgBox(ex.Message.ToString)
Finally
SQLConnection.Close()
End Try 

Эта часть программы проверяет, совпадают ли даты с помощью этого кода: prevDate = newDate , если они совпадают, программа добавит facility_produceна той же строке в соответствующем столбце. Если дата не совпадает, программа проверяет, равен ли col нулю, если ноль, то datagridview по-прежнему пуст, и программа введет первую строку с ее произведенной суммой. И если col не равен нулю, это означает, что уже есть новая дата и что уже есть существующая строка, тогда программа должна ввести следующую строку значений ниже.

 If prevDate = newDate Then

    table.Rows(row)(col) = tableRetrieve("facility_produce")
    prevDate = newDate
    col  = 1

Else

    If col = 0 Then

        col  = 1
        table.Rows.Add(tableRetrieve("sentDate"))
        table.Rows(row)(col) = tableRetrieve("facility_produce")
        prevDate = newDate
        col  = 1

    Else

        col = 1
        row  = 1
        table.Rows.Add(tableRetrieve("sentDate"))
        table.Rows(row)(col) = tableRetrieve("facility_produce")
        prevDate = newDate
        col  = 1

    End If

End If 

Извините за длинный пост, но я надеюсь, что это поможет и поможет всем, кто использует inner join, а затем использует значения строк в качестве заголовков столбцов. Мне было трудно решить эту проблему. Не использовал программирование на VB с 2010 года. Я все еще использовал VB 6 еще в 2010 году, и я очень устарел с VB.Теперь чистая. Есть чему поучиться, и мне это нравится.

Спасибо @milda за помощь. Ваш код помог мне разместить мои значения в правильных позициях.

Комментарии:

1. О да, вы сами поняли! Это лучший способ изучить его.

2. Большое вам спасибо! Надеюсь, что мой код здесь также поможет другим программистам. 🙂