none
removehandler移除事件监控不成功 RRS feed

  • 问题

  • 最近在利用vsto平台开发excel的外接程序,

    在点击某按钮激活后需要激活对globals.thisaddin.application.sheetseletionchange事件的监控,监控到事件则执行sub txchan()

    我的编程逻辑是在button.click时间中添加addhandler globals.thisaddin.application.sheetseletionchange,addressof txchan

    在txchan过程执行的末尾添加removehandler globals.thisaddin.application.sheetseletionchange,addressof txchan

    但这种方法行不通,当我的txchan过程执行完毕后,globals.thisaddin.application.sheetseletionchange事件的监控依然在继续,在更改选择单元格后又再次运行了txchange,并且removehandler事件有这样的提示,代表附在最下

    警告 4 “AddressOf”表达式在此上下文中不起作用,因为“AddressOf”的方法参数需要到该事件的委托类型的宽松转换。将“AddressOf”表达式赋给变量,并使用变量将该方法作为处理程序进行添加或移除。


    来论坛求助

    public class aa

        Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
            MsgBox("按格式选择数据区域")
            AddHandler Globals.ThisAddIn.Application.SheetSelectionChange, AddressOf txchange
          End Sub

          Dim rng As Excel.Range, msgresult As MsgBoxResult
            Dim ws As Excel.Worksheet, shuju(,) As Object, rw As Integer, jgs As Integer, jg(,) As Object, min As Integer, str As String, tianchong(,) As Object, z As Integer
            rng = Globals.ThisAddIn.Application.Selection
            TextBox4.Text = rng.Address
            msgresult = MsgBox("开始吗?", vbYesNoCancel)
            If msgresult = vbYes Then
                shuju = rng.Value
                ReDim jg(rng.Rows.Count - 2, 2), tianchong(UBound(shuju), 3)
                tianchong(0, 0) = "标签"
                tianchong(0, 1) = "到最近风机距离"
                tianchong(0, 2) = "最近的风机编号"
                tianchong(0, 3) = "最近风机的海拔高差"
                For i = 1 To UBound(shuju)
                    jgs = 0
                    min = 10000
                    For j = 1 To UBound(shuju)
                        If i <> j Then
                            jg(jgs, 0) = Globals.ThisAddIn.Application.WorksheetFunction.Round(Math.Sqrt((shuju(i, 2) - shuju(j, 2)) ^ 2 + (shuju(i, 3) - shuju(j, 3)) ^ 2), 0)
                            jg(jgs, 1) = shuju(j, 1)
                            jg(jgs, 2) = Math.Abs(shuju(i, 4) - shuju(j, 4))
                            jgs = jgs + 1
                        End If
                    Next
                    For k = 0 To UBound(jg)
                        If min > jg(k, 0) Then
                            min = jg(k, 0)
                            str = jg(k, 1)
                            z = jg(k, 2)
                        End If
                    Next
                    tianchong(i, 0) = shuju(i, 1)
                    tianchong(i, 1) = min
                    tianchong(i, 2) = str
                    tianchong(i, 3) = z
                Next
                ws = Globals.ThisAddIn.Application.Worksheets.Add
                With ws.Cells(1, 1).resize(UBound(tianchong) + 1, 4)
                    .value = tianchong
                    .columnwidth = 10
                    .entirerow.autofit()
                    .wraptext = True
                    .HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
                    .VerticalAlignment = Excel.XlVAlign.xlVAlignCenter
                End With

            End If
            RemoveHandler Globals.ThisAddIn.Application.SheetSelectionChange, AddressOf txchange

    end sub

    end class


    2015年2月3日 12:51

答案

  • 可能你的代码没贴完整, 我没有看到你的txchange是怎么定义的。

    一般报这个错的原因是 你所定义的方法和该事件的语法格式不匹配。

    以当前的问题为例, 从 Workbook.SheetSelectionChange 事件 (Excel) 我们可以看出它应该包含两个参数。

      

    参数

    名称

    必需/可选

    数据类型

    说明

    Sh

    必需  

    Object

    新选定区域所在的工作表。

    Target

    必需  

    Range

    新选定的区域。  

    我们可以看出这两个参数都是必须的, 因此在定义handler的时候需要这样定义

    Public Sub txChange(ByVal Sh As Object, _ 
     ByVal Target As Excel.Range) 
     
    End Sub
    

    拿一个button举例。

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            AddHandler Button2.Click, AddressOf txChange
        End Sub
    
        Public Sub txChange(sender As Object, e As EventArgs)
            Me.Text &= 1        
            RemoveHandler Button2.Click, AddressOf txChange
    
        End Sub



    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2015年2月4日 2:32
    版主