none
Откуда берется CurrentCellChanged??? RRS feed

  • Вопрос

  • Многоуважаемый All!
    Есть простая форма, на ней DataGridView, код такой:

     

    Public Class Form1

     

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            Dim dt As DataTable = New DataTable

            dt.Columns.Add(New DataColumn("Column1", GetType(Integer)))

            dt.Columns.Add(New DataColumn("Column2", GetType(Integer)))

            dt.Columns.Add(New DataColumn("Column3", GetType(Integer)))

            dt.Columns.Add(New DataColumn("Column4", GetType(Integer)))

            dt.Columns.Add(New DataColumn("Column5", GetType(Integer)))

     

            For i As Integer = 0 To 10

                dt.Rows.Add(i, i, i, i * 10, i + 5)

            Next

     

            Dim dv As DataView = New DataView(dt, "", "", DataViewRowState.CurrentRows)

            Me.dgvMain.DataSource = dv

            Me.dgvMain.CurrentCell = Me.dgvMain(3, 5)

        End Sub

        Private Sub dgvMain_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dgvMain.CurrentCellChanged

            If Me.dgvMain.CurrentCell Is Nothing Then

                Console.WriteLine("Nothing")

                Exit Sub

            End If

            Console.WriteLine(Me.dgvMain.CurrentCell.ToString)

        End Sub

     

        Private Sub Form1_ParentChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ParentChanged

     

        End Sub

    End Class

     

     

    Результат предсказуемый:

    DataGridViewTextBoxCell { ColumnIndex=0, RowIndex=0 }
    Nothing
    DataGridViewTextBoxCell { ColumnIndex=0, RowIndex=0 }
    DataGridViewTextBoxCell { ColumnIndex=3, RowIndex=5 }

     

    Но стоит эту форму сделать дочерней по отношению к некой MDI-форме, появляется неизвестно откуда ещё 3 строчки и фокус уже не стоит при загрузке на нужной ячейке:

     

    Public Class frmParent

        Private Sub frmParent_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            Dim frm As Form1 = New Form1

            frm.MdiParent = Me

            frm.Show()

        End Sub

    End Class

     


    Результат уже "дополненный":

    DataGridViewTextBoxCell { ColumnIndex=0, RowIndex=0 }

    Nothing
    DataGridViewTextBoxCell { ColumnIndex=0, RowIndex=0 }
    DataGridViewTextBoxCell { ColumnIndex=3, RowIndex=5 }
    Nothing
    DataGridViewTextBoxCell { ColumnIndex=0, RowIndex=0 }
    DataGridViewTextBoxCell { ColumnIndex=0, RowIndex=5 }

     

    Откуда берутся синие строчки???

    Заранее благодарен!

    6 июля 2011 г. 13:20

Ответы

Все ответы

  • Здравствуйте.

    Откуда берутся дополнительные вызовы события CurrentCellChanged не скажу. Скорее всего при создании дочерней mdi формы происходит еще какая-нибудь дополнительная инициализация dataGridView после события Form_Load. Как решение - задавайте текущую ячейку не в FormLoad событии, а в FormShown, когда все контролы инициализированы и форма отображается на экране пользователя. В этом случае сборса ячейки происходить не будет.


    Для связи [mail]
  • я докопался до существования варианта с FormShown, но некрасиво как-то...
    • Помечено в качестве ответа Abolmasov Dmitry 13 июля 2011 г. 6:05
    7 июля 2011 г. 13:21
  • Сброс установленной ячейки происходит после выполнения Form_Load, так что в любом случае установку придется делать в другом событии и будет так же некрасиво.


    Для связи [mail]
    11 июля 2011 г. 9:48