在菜单项单击上验证DataGridView

时间:2011-02-02 02:46:09

标签: .net winforms datagridview validation

您好我有一个包含菜单栏,工具条和DataGridView控件的窗体。 我正在使用VB.Net。

我在工具条上有一个保存按钮和一个保存菜单项。我需要在保存发生之前运行验证。我的问题是,如果更改单元格值,然后单击任一保存按钮,则不会运行验证,因此不会保存新值。

我已经看过DataGridView上的事件,比如'leave'事件,但似乎没有人做我想要的事情。即单击任一保存按钮时,“离开”不会运行。

当点击其中一个按钮(或任何其他按钮)时,有没有人知道我可以运行验证码的方法。

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:3)

问题是,点击ToolStrip控件上的按钮或MenuStrip控件上的项目会导致Validating / {{ 1}}当前所选控件引发的事件。这是设计上的。与菜单和工具栏交互不会导致当前选定的控件失去焦点,这意味着永远不会触发验证。

如果你仔细考虑,这甚至是有道理的。想象一下,您的验证逻辑要求每个单元格包含一个值(即,它阻止单元格保持空白或为空)。如果每次用户尝试从菜单或工具栏中选择项目时都会触发验证事件,则他们甚至无法将任何内容“粘贴”到单元格中!

如果你坚持要覆盖这种行为,你将不得不在表单中添加一堆丑陋的额外逻辑,并且你冒着严重烦扰用户的风险。我只想说我不推荐它。

更好的解决方案是将验证逻辑提取到单独的方法中,并在事件处理程序方法的开头为每个要触发验证的菜单/工具条项目手动调用它。或者,您可以使用InvokeLostFocus method在保存工具条按钮单击事件处理程序的开头为Validate控件引发LostFocus事件。类似的东西:

DataGridView

答案 1 :(得分:1)

对我来说,在菜单的点击事件中调用我的表单的“验证”功能足以完成我需要的操作,其中包括强制触发网格的验证事件。

答案 2 :(得分:0)

在触发TextBox事件后Leave之类的控件上进行验证时,DataGridView控件仅在编辑模式下执行验证,并且仅在每个单元格的基础上执行验证

您可以处理CellValidating上的DataGridView事件以捕获当前单元格经过验证的时刻 - 如果焦点从网格移动到您的保存按钮,则会触发此事件。如果单元格的值无效,您可以将Cancel对象上的DataGridViewCellValidatingEventArgs属性设置为true

答案 3 :(得分:0)

我遇到了同样的问题,各种论坛上的回复都没有对我有所帮助。在我的情况下,我在表单上有多个网格。甚至其他UserControls中的一些网格。所以我创建了以下例程,并在相关的ToolStrip单击事件中调用CommitGridEdit()。它似乎为我做了伎俩。

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