.net - 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
解决方案
我曾经使用以下模式来解决这个问题:
定义一个变量
Private m_eventLock As Integer
在可以触发事件的方法中,执行以下操作
Private Sub DoStuffThatCascasedLotsOfEvents() m_eventLock += 1 Try 'NORMAL LOGIC GOES HERE Finally m_eventLock -= 1 End Try End Sub
(您可能有不止一种遵循这种模式的方法,这很好)
在您的事件处理程序中
Private Sub myControl_MyEvent(source As Object, args As EventArgs) If m_eventLock > 0 Then Return ' THE REST OF YOUR NORMAL LOGIC End Sub
推荐阅读
- r - 从一月到当年和上一年的最新可用月份的总和
- python - 如何确定每句否定词的数量
- dynamic - Ionic5:使用 sharedModule 在所有应用页面上设置页脚并从 app.component 控制它(开/关)
- c - deleteNode 删除它前面的节点
- java - Github 操作:setup-java 带有多个 JDK 和相应的环境变量
- javascript - React 的 useEffect 钩子如何访问它下面定义的所有函数表达式?
- xquery - MarkLogic 查询控制台中的属性选项卡是什么
- xcode - Xcode 12:函数“SecKeyEncrypt”的隐式声明在 C99 中无效
- assembly - 在不同的内核上运行时无法使用带有函数名称的调用指令
- imperative-languages - 命令式语言示例