Проверьте DataGridView по нажатию пункта меню - PullRequest
8 голосов
/ 02 февраля 2011

Привет, у меня есть форма Windows, содержащая строку меню, панель инструментов и элемент управления DataGridView.Я использую VB.Net.

У меня есть кнопка сохранения на панели инструментов и пункт меню сохранения.Мне нужно выполнить проверку перед сохранением.Моя проблема в том, что если значение ячейки изменяется, а затем нажимается любая из кнопок сохранения, проверка не запускается, и поэтому новое значение не сохраняется.например, событие «уйти», но никто не делает то, что я хочу.То есть «выход» не запускается при нажатии любой из кнопок сохранения.

Кто-нибудь знает, как я могу запустить свой код проверки при нажатии одной из этих кнопок (или любой другой кнопки).*

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

Ответы [ 4 ]

4 голосов
/ 02 февраля 2011

Проблема заключается в том, что нажатие кнопки на элементе управления ToolStrip или элемента на элементе управления MenuStrip делает не причиной того, что события Validating / Validate будут вызванывыбранный в данный момент элемент управления.Это по замыслу.Взаимодействие с меню и панелями инструментов не приводит к тому, что выбранный элемент управления теряет фокус, что означает, что проверка никогда не запускается.

Если вы тщательно обдумаете это, это даже имеет смысл.Представьте, что ваша логика проверки требует, чтобы каждая ячейка содержала значение (т. Е. Она не позволяла оставлять ячейки пустыми или пустыми).Если событие проверки запускалось каждый раз, когда пользователь пытался выбрать элемент из меню или панели инструментов, он не мог даже «вставить» что-либо в ячейку!

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

Лучшее решение - извлечь вашу логику проверки в отдельный метод и вызвать ее вручную в начале метода обработчика событий для каждого элемента меню / панели инструментов.что вы хотите вызвать проверку.В качестве альтернативы вы можете вызвать событие LostFocus для элемента управления DataGridView в начале обработчика события нажатия кнопки «Сохранить» на панели инструментов, используя метод InvokeLostFocus .Что-то вроде:

InvokeLostFocus(myDataGridView, EventArgs.Empty)
1 голос
/ 15 июня 2011

Для меня достаточно было вызвать функцию «Проверка» моей формы из события щелчка меню, чтобы сделать то, что мне было нужно, в том числе принудительно запустить события проверки сетки.

0 голосов
/ 25 июля 2013

У меня была такая же проблема, и ни один из ответов на различных форумах не помог мне. В моем случае у меня было несколько сеток на форме. И даже некоторые сетки внутри других UserControls. Поэтому я создал следующие подпрограммы и вызвал CommitGridEdit () в соответствующих событиях щелчка ToolStrip. Это, кажется, делает трюк для меня.

Public Sub CommitGridEdit(ByVal frm As Form)
    ' Clicking on a ToolStrip menu item will not cause the grid to end editting the current cell.
    ' So we have to find if any grid is in edit mode and do this ourself.
    Dim grid As DataGridView = GetFocusedGrid(frm)

    If grid Is Nothing Then Exit Sub

    If Not grid.CurrentCell Is Nothing Then
        If grid.CurrentCell.IsInEditMode Then
            grid.EndEdit()
        End If
    End If
End Sub

Private Function GetFocusedGrid(ByVal ctl As Control) As DataGridView
    For Each c As Control In ctl.Controls
        If TypeOf c Is DataGridView AndAlso c.ContainsFocus Then
            Return c
        ElseIf c.Controls.Count > 0 Then
            Dim c2 As Control = GetFocusedGrid(c)
            If Not c2 Is Nothing Then Return c2
        End If
    Next c
    Return Nothing
End Function
0 голосов
/ 02 февраля 2011

В то время как проверка происходит на элементах управления, таких как TextBox сразу после запуска события Leave, элемент управления DataGridView выполняет проверку только в режиме редактирования и только для каждой ячейки.

Вы можете обработать событие CellValidating на DataGridView, чтобы зафиксировать момент, когда текущая ячейка проходит проверку - это событие сработает, если фокус переместится с сетки на кнопку сохранения. Если значение ячейки недопустимо, можно установить для свойства Cancel объекта DataGridViewCellValidatingEventArgs значение true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...