【问题标题】:Passing Parameter to RemoveHandler VB.NET将参数传递给 RemoveHandler VB.NET
【发布时间】:2015-11-26 16:51:44
【问题描述】:

我有 3 个复选框,我想用作一个单选按钮组,但我的新工作是在 vb.net 和 WinForms 中。

我希望通过用这样的函数调用替换注释代码来简化 3 个事件处理程序:

Private Sub cbLinqQuery_CheckedChanged(sender As Object, e As EventArgs) handles cbLinqQuery.CheckedChanged
    SafeCheckChg(cbDataTable, cbDataTable_CheckedChanged, cbLinqQuery.Checked)
    'RemoveHandler cbDataTable.CheckedChanged, AddressOf cbDataTable_CheckedChanged
    'cbDataTable.Checked = Not cbLinqQuery.Checked
    'AddHandler cbDataTable.CheckedChanged, AddressOf cbDataTable_CheckedChanged

    RemoveHandler cbArray.CheckedChanged, AddressOf cbArray_CheckedChanged
    cbArray.Checked = Not cbLinqQuery.Checked
    AddHandler cbArray.CheckedChanged, AddressOf cbArray_CheckedChanged

    btnDefaultBoundData_Click(sender, e)
End Sub

Private Sub SafeCheckChg(ByRef cb As CheckBox, ByRef handler As EventHandler, checked As Boolean)
    RemoveHandler cb.CheckedChanged, AddressOf handler
    cb.Checked = Not checked
    AddHandler cb.CheckedChanged, AddressOf handler.Clone
End Sub

但我没有成功将事件处理程序作为参数传递。我尝试将它作为事件处理程序、委托和 void 传递,但编译器似乎无法理解在 RemoveHandler/AddressOf 调用中使用它。

有没有一种方法可以让我从传递的对象中获取事件处理程序?有没有可以用作参数的类型。显然我并不绝望,这是以更好的代码而不是更好的功能为名。

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    所以找到了一个非常接近的答案,只需稍加调整即可:

    Inspiration

    解决方案只是将AddressOf foo 作为参数传递并从RemoveHandler / AddHandler 调用中删除AddressOf。 (出于某种原因,我认为这是 Add/RemoveHandler 调用的必需部分,而不是对参数进行操作的单独函数调用。)

    最终代码:

    Private Sub cbLinqQuery_CheckedChanged(sender As Object, e As EventArgs) Handles cbLinqQuery.CheckedChanged
        SafeCheckChg(cbDataTable, AddressOf cbDataTable_CheckedChanged, cbLinqQuery.Checked)
        SafeCheckChg(cbArray, AddressOf cbArray_CheckedChanged, cbLinqQuery.Checked)
        btnDefaultBoundData_Click(sender, e)
    End Sub
    
    Private Sub SafeCheckChg(ByRef cb As CheckBox, ByRef handler As EventHandler, checked As Boolean)
        RemoveHandler cb.CheckedChanged, handler
        cb.Checked = checked
        AddHandler cb.CheckedChanged, AddressOf handler.Clone
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      相关资源
      最近更新 更多