首页 > 解决方案 > VB.NET:杰出事件

问题描述

使用 VB.NET,是否有办法区分来​​自用户操作的事件和来自代码的事件?

这就是我问这个的原因:我有一个用户可以编辑的数据网格,我想根据单元格更改检测更新他们键入的内容(参见下面的代码)。但是当程序从数据网格更新单元格时,这些更新会被检测为单元格更改(如预期的那样)。有没有办法以不同的方式处理用户所做的单元格更改和应用程序本身所做的单元格更改?

Private Sub add_linked_obj_datagrid_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles add_linked_obj_datagrid.CellValueChanged

        Dim cellValue As String = add_linked_obj_datagrid.Rows(e.RowIndex).Cells(e.ColumnIndex).Value?.ToString()

        Select Case e.ColumnIndex
            Case 0
                add_linked_obj_datagrid.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = LCase(cellValue)
                Select Case cellValue
                    Case "facebook", "twitter", "instagram", "youtube", "dailymotion", "site web", "twitch", "hashtag"
                        Exit Sub
                    Case Else
                        Dim msg_error_type_interdit As String = "Le type" & cellValue & " n'est pas pris en charge."
                        MsgBox(msg_error_type_interdit, MsgBoxStyle.Exclamation)
                        add_linked_obj_datagrid.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = Nothing
                End Select
            Case 1
                add_linked_obj_datagrid.Rows(e.RowIndex).Cells(0).Value = get_type_objet_from_value(cellValue, True)
                add_linked_obj_datagrid.Rows(e.RowIndex).Cells(1).Value = clean_value_objet(add_linked_obj_datagrid.Rows(e.RowIndex).Cells(1).Value, add_linked_obj_datagrid.Rows(e.RowIndex).Cells(0).Value)
        End Select
    End Sub

标签: .netvb.netevent-handling

解决方案


我曾经使用以下模式来解决这个问题:

  1. 定义一个变量Private m_eventLock As Integer

  2. 在可以触发事件的方法中,执行以下操作

    Private Sub DoStuffThatCascasedLotsOfEvents()     
       m_eventLock += 1    
       Try
    
          'NORMAL LOGIC GOES HERE
    
       Finally
          m_eventLock -= 1
       End Try
    End Sub
    

(您可能有不止一种遵循这种模式的方法,这很好)

  1. 在您的事件处理程序中

    Private Sub myControl_MyEvent(source As Object, args As EventArgs)
    
       If m_eventLock > 0 Then Return
    
       ' THE REST OF YOUR NORMAL LOGIC
    
    End Sub
    

推荐阅读