【问题标题】:VB.NET : distinguished eventsVB.NET:杰出事件
【发布时间】:2021-02-15 09:31:03
【问题描述】:

使用 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

【问题讨论】:

  • 也许改为处理EndEdit 事件?或者直接处理EditingControlShowing中的TextBox控件。或者提供一个带有自己的 TextBox / RichTextBox 控件的自定义列,您可以在其中管理所有需要的内部逻辑。

标签: .net vb.net event-handling


【解决方案1】:

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

  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
    

【讨论】:

    【解决方案2】:

    我遵循 Jimi 的最后建议并使用颜色来解决我的问题:当应用程序编辑一行时,它的颜色设置为浅绿色。 这不是我想的完全解决方案,但到目前为止效果很好。

    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()
            If add_linked_obj_datagrid.Rows(e.RowIndex).DefaultCellStyle.BackColor <> Color.LightGreen Then
                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"
                                add_linked_obj_datagrid.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.LightGreen
                            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)
                        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)
                        add_linked_obj_datagrid.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.LightGreen
                End Select
            End If
        End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多