Direct Cast дает нулевую ошибку для datagridview

В настоящее время я работаю в VB.NET Express для настольных компьютеров, 2013. Мне трудно связать данные SQL с некоторыми представлениями данных в цикле с массивом. Я получаю нулевую ошибку объекта и ее, потому что на прямой линии приведения не тянет сетку данных. У меня есть несколько видов сетки на инструменте управления вкладками, по одному на каждой вкладке. Вот мой код:

 try
 Dim array() As Integer = {"2", "3", "4", "7", "8", "10", "11", "12"}

        For Each value As Integer In array
            Dim RelativeDGV = DirectCast(Me.Controls("DataGridLine" & value), DataGridView)
            Using conn1 As New SqlConnection(connstring)
                conn1.Open()
                Using comm1 As New SqlCommand("SELECT LineNumber FROM tableA where LineNumber = @LineNumber", conn1)
                    comm1.Parameters.AddWithValue("@LineNumber", value)
                    Dim dt As New DataTable
                    Dim sql As New SqlDataAdapter(comm1)
                    sql.Fill(dt)
                   RelativeDGV.DataSource = dt
                End Using
                conn1.Close()
            End Using 
        Next

    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try

Ошибка на линии

 Dim RelativeDGV = DirectCast(Me.Controls("DataGridLine" & value), DataGridView)

Но нулевая ошибка не срабатывает до

  RelativeDGV.DataSource = dt

2 ответа

Решение

Попробуйте использовать список DataGridView как это:

Try
    Dim array() As DataGridView = {DataGridLine2, DataGridLine3, DataGridLine4, DataGridLine7, DataGridLine8, DataGridLine10, DataGridLine11, DataGridLine12}
    For Each RelativeDGV As DataGridView In array
        Dim value As Integer = Regex.Replace(RelativeDGV.Name, "[^0-9]+", String.Empty)
        'or like this
        'Dim value As Integer = RelativeDGV.Name.Substring(12, RelativeDGV.Name.Length - 12)
        Using conn1 As New SqlConnection(connstring)
            conn1.Open()
            Using comm1 As New SqlCommand("SELECT LineNumber FROM tableA where LineNumber = @LineNumber", conn1)
                comm1.Parameters.AddWithValue("@LineNumber", value)
                Dim dt As New DataTable
                Dim sql As New SqlDataAdapter(comm1)
                sql.Fill(dt)
                RelativeDGV.DataSource = dt
            End Using
            conn1.Close()
        End Using
    Next

Catch ex As Exception
    MsgBox(ex.ToString)
End Try

Если различные элементы управления DGV находятся на других вкладках, они не будут в Me.Controls, Вместо того, чтобы вылавливать их и разыгрывать их, вы можете перебирать их массив, так как вы знаете имя. Вам также не нужно создавать новое соединение для каждого или дублировать таблицы данных для каждого:

Dim dgvCtrls As DataGridView() = {DataGridLine2, DataGridLine3, DataGridLine4}

Using conn1 As New SqlConnection(connstring)
    conn1.Open()
    Using comm1 As New SqlCommand("SELECT LineNumber FROM...", conn1)
        '    ...
        dt.Load(comm1.ExecuteReader())
    End Using

    conn1.Close()
End Using

For Each dgv In dgvCtrls
    dgv.DataSource = dt
Next

Вам потребуется только 8 идентичных таблиц данных, если вы не хотите, чтобы каждая сетка автоматически отражала изменения, сделанные в других. Для этого используйте набор данных в том же соединении для создания таблиц:

Dim SQL = "..."
Dim dgvCtrls As DataGridView() = {dgv5, dgv2, dgv3,...}
Dim ds = New DataSet

Using dbcon As New SqlConnection(SQLConnStr)
    Using cmd As New SqlCommand(SQL, dbcon)
        dbcon.Open()
        For n As Int32 = 0 To dgvCtrls.Count - 1
            ds.Load(cmd.ExecuteReader, LoadOption.OverwriteChanges, dgvCtrls(n).Name)
        Next
    End Using
End Using

For Each dgv In dgvCtrls
    dgv.DataSource = ds.Tables(dgv.Name)
Next
Другие вопросы по тегам