Datagridview — список со списком из нескольких столбцов

#vb.net #datagridview

#vb.net #datagridview

Вопрос:

Мне нужен многоколоночный combobox в datagrid для отображения 2 табличных значений из моей базы данных, разделенных строкой в combobox. Я уже сделал это, используя обычный combobox с событием Enter и Draw_Item, и теперь я пытаюсь сделать это и в datagrid — в событиях Cell_Enter и Cell_Painting. Проблема возникает, когда я пытаюсь установить DataViewrow — я получаю сообщение об ошибке «Индекс не является членом DataGridView …». Вот мой код:

  Private Sub MyDGV_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles MyDGV.CellEnter
        If e.ColumnIndex = 0 Then

            Dim SQL As String = "SELECT Field1,Field2 from MyTable"
            Dim dtb As New DataTable()
            dtb.Columns.Add("Field1", System.Type.GetType("System.String"))
            dtb.Columns.Add("Field2", System.Type.GetType("System.String"))

            Try
               Myconn() 'My connection to Oracle
               Using dad As New OracleDataAdapter(SQL, Myconn)
                    dad.Fill(dtb)
               End Using
               Column1.DisplayMember = "Field1"
               Column1.DataSource = dtb

            Catch ex As Exception
                MessageBox.Show(ex.Message)
            Finally
                Myconn.Close()
            End Try
        End If

 End Sub

    Private Sub MyDGV_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles MyDGV.CellPainting

        If e.ColumnIndex = 0 Then

           Dim drv As DataRowView = CType(Column1.Items(e.Index), DataRowView) 'I have error here - this line should get value of each row   

           Dim id As String = drv("Field1").ToString()
           Dim name As String = drv("Field2").ToString()

           Dim r1 As Rectangle = e.CellBounds
           r1.Width = r1.Width / 2

           Using sb As SolidBrush = New SolidBrush(MyDGV.BackColor)
               e.Graphics.DrawString(id, e.CellStyle.Font, sb, r1)
           End Using

           Using p As Pen = New Pen(Color.AliceBlue)
               e.Graphics.DrawLine(p, r1.Right, 0, r1.Right, r1.Bottom)
           End Using

           Dim r2 As Rectangle = e.CellBounds
           r2.X = e.CellBounds.Width / 2
           r2.Width = r2.Width / 2

           Using sb As SolidBrush = New SolidBrush(MyDGV.BackColor)
               e.Graphics.DrawString(name, e.CellStyle.Font, sb, r2)
           End Using

        End If

    End Sub
  

Любая помощь очень ценится!

Ответ №1:

Проверьте члены класса DataGridViewCellPaintingEventArgs. Я бы попробовал использовать свойство RowIndex:

 Dim drv As DataGridViewRow = CType(MyDGV.Rows(e.RowIndex), DataGridViewRow)
  

Затем вам может потребоваться получить нужные вам значения, обратившись к свойству cells:

 Dim id As String = drv.Cells("Field1").Value.ToString()
Dim name As String = drv.Cells("Field2").Value.ToString()
  

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

1. Я действительно пробовал это перед публикацией здесь. Это не работает — ошибка «Значение типа DataGridViewRow не может быть преобразовано в DataRowView».

2. @Нет псевдонима, теперь я получаю сообщение об ошибке: «Должно быть неотрицательным и меньше размера коллекции». Я уменьшаю DatagridViewCellPaintingEventArgs до того, как заполняется поле со списком. Могу ли я это изменить ?… Я попытался изменить код Cell_Enter на Form_Load, но все тот же.