Зацикливание элементов управления Datagridview с использованием массива с обработчиками событий

#vb.net #datagridview

#vb.net #datagridview

Вопрос:

Я создаю подпрограмму, которая будет создавать datagridviews в зависимости от желаемого количества циклов. Я предполагаю, что проблема заключается в том, что столбцы, которые должны быть созданы для каждого datagridview, все объединены в первом созданном datagridview. Причина, по которой я предполагаю это, заключается в том, что я вижу другие datagridview без столбцов и строк (только серый фон). Я предполагаю, что мои объявления переменных столбца не подходят для того, что я хочу сделать. Пожалуйста, посмотрите мой код.

Подпрограмма для создания кода Datagridview:

  Private Sub DrawGridViewWLoop()
    Dim dgvIterator As Short
    ReDim dgvControlArr(10)

    For dvgIterator = 0 To 3
        dgvControlArr(dvgIterator) = New System.Windows.Forms.DataGridView
        With dgvControlArr(dgvIterator)
            .Size = New System.Drawing.Size(0, 0)
            .AutoSize = True
            .EnableHeadersVisualStyles = False
            .RowHeadersVisible = False
            .BackgroundColor = Color.White
            .BorderStyle = BorderStyle.None
            .AllowUserToAddRows = False
            .AllowUserToDeleteRows = False
            .AllowUserToOrderColumns = False
            .AllowUserToResizeColumns = False
            .AllowUserToResizeRows = False
            .ReadOnly = True
            .MultiSelect = False
        End With

        Dim colID_2 As New System.Windows.Forms.DataGridViewTextBoxColumn
        With colID_2
            .HeaderText = "ID"
            .Name = "colID"
            .HeaderCell.Style.BackColor = Color.SpringGreen
            .HeaderCell.Style.ForeColor = Color.White
            .HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
            .Width = 300
        End With

        Dim colG_2 As New System.Windows.Forms.DataGridViewButtonColumn
        With colG_2
            .HeaderText = "G"
            .Name = "colG"
            .HeaderCell.Style.BackColor = Color.SpringGreen
            .HeaderCell.Style.ForeColor = Color.White
            .HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
            .Width = 40
        End With

        Dim colI_2 As New System.Windows.Forms.DataGridViewTextBoxColumn
        With colI_2
            .HeaderText = "I"
            .Name = "colI"
            .HeaderCell.Style.BackColor = Color.SpringGreen
            .HeaderCell.Style.ForeColor = Color.White
            .HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
        End With

        Dim colO_2 As New System.Windows.Forms.DataGridViewTextBoxColumn
        With colO_2
            .HeaderText = "O"
            .Name = "colO"
            .HeaderCell.Style.BackColor = Color.SpringGreen
            .HeaderCell.Style.ForeColor = Color.White
            .HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
        End With

        Dim colQ_2 As New System.Windows.Forms.DataGridViewTextBoxColumn
        With colQ_2
            .HeaderText = "Q"
            .Name = "colQ"
            .HeaderCell.Style.BackColor = Color.SpringGreen
            .HeaderCell.Style.ForeColor = Color.White
            .HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
        End With

        Dim colIn_2 As New System.Windows.Forms.DataGridViewTextBoxColumn
        With colIn_2
            .HeaderText = "In"
            .Name = "colIn"
            .HeaderCell.Style.BackColor = Color.SpringGreen
            .HeaderCell.Style.ForeColor = Color.White
            .HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
        End With

        dgvControlArr(dgvIterator).Columns.AddRange(colID_2, colG_2, colI_2, colO_2, colQ_2, colIn_2)

        With dgvControlArr(dgvIterator)
            .Columns("colID").HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            .Columns("colG").HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            .Columns("colI").HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            .Columns("colO").HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            .Columns("colQ").HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
            .Columns("colID").SortMode = DataGridViewColumnSortMode.NotSortable
            .Columns("colG").SortMode = DataGridViewColumnSortMode.NotSortable
            .Columns("colI").SortMode = DataGridViewColumnSortMode.NotSortable
            .Columns("colO").SortMode = DataGridViewColumnSortMode.NotSortable
            .Columns("colQ").SortMode = DataGridViewColumnSortMode.NotSortable
        End With

        With dgvControlArr(dgvIterator).Rows
            .Add("01")
            .Add("02")
            .Add("03")
            .Add("04")
            .Add("05")
        End With

        dgvControlArr(dgvIterator).Rows(1).Cells(2).Value = "Y"
        dgvControlArr(dgvIterator).Rows(0).Cells(5).Value = "sample 1"
        dgvControlArr(dgvIterator).Rows(2).Cells(5).Value = "sample 3"
        dgvControlArr(dgvIterator).Rows(3).Cells(5).Value = "sample 4"
        dgvControlArr(dgvIterator).Rows(3).Cells(2).Value = "Y"
        dgvControlArr(dgvIterator).Rows(0).Cells(2).Value = "Y"

        AddHandler dgvControlArr(dgvIterator).SelectionChanged, AddressOf Me.DataGridViews_SelectionChanged
        AddHandler dgvControlArr(dgvIterator).CellContentClick, AddressOf Me.DataGridViews_CellContentClick
    Next
    Me.Controls.AddRange(dgvControlArr)
    GridViewStackOrder()
End Sub
  

Код для упорядочивания моих местоположений datagridview

 Private Sub GridViewStackOrder()

    dgvControlArr(0).Location = New System.Drawing.Point(10, 250)
    dgvControlArr(1).Location = New System.Drawing.Point(10, 750)
    dgvControlArr(2).Location = New System.Drawing.Point(10, 1250)
    dgvControlArr(3).Location = New System.Drawing.Point(10, 1750)

End Sub
  

Код для моих обработчиков событий

 Private Sub DataGridViews_SelectionChanged(sender As System.Windows.Forms.DataGridView, e As EventArgs)
    sender.ClearSelection()
End Sub

Private Sub DataGridViews_CellContentClick(sender As System.Windows.Forms.DataGridView, e As DataGridViewCellEventArgs)
    If e.RowIndex < 0 OrElse Not e.ColumnIndex = sender.Columns(1).Index Then Return
    If e.RowIndex >= 0 Then
        If sender.Rows(e.RowIndex).Cells(2).Value = "Y" Then
            Dim chosenID As String = sender.Rows(e.RowIndex).Cells(5).Value
            MsgBox(chosenID)
        Else
            MsgBox("Input not available.")
        End If
    End If
End Sub
  

Моя цель здесь — создать столбцы и строки для всего gridview, а не только для первого. Также я хотел бы запретить выбор для всех datagridviews, поэтому я создал обработчик selection_changed. Я знаю, что это довольно просто, но, пожалуйста, ваши идеи будут очень полезны. Спасибо, гении!

Ответ №1:

У вас опечатка в коде. Вы объявляете счетчик следующим образом:

 Dim dgvIterator As Short
  

Теперь вот в чем ваша проблема, вы смешиваете dgv и dvg.

 For dvgIterator = 0 To 3
    dgvControlArr(dvgIterator) = New System.Windows.Forms.DataGridView
  

Чтобы исправить это, просто замените приведенные выше строки следующими:

 For dgvIterator = 0 To 3
    dgvControlArr(dgvIterator) = New System.Windows.Forms.DataGridView