2010-03-05 3 views
1

그래서 메뉴 항목의 실제 선택 뒤에있는 이벤트가 여러 번 실행되는 것 외에는 상황에 맞는 메뉴가 작동합니다. 처음 클릭하면 한 번, 두 번, 세 번 발사됩니다. 그래서, 방금 전한 예제에서 3 번의 클릭으로 총 6 회 (1 + 2 + 3)의 해고를했을 것입니다. 왜 그런가요?내 Outlook 컨텍스트 메뉴 (추가 기능) 단추가 한 번의 클릭으로 여러 번 실행됩니다.

다음은 메뉴 항목을 만드는 방법에 대한 내 코드입니다. 나는 그것을 관련 조각들로 잘라 냈다. .Tag, .Visible 및 .Caption 속성과 같은 것을 생략했습니다. .NET 3.5 및 VS 2008을 사용하여이를 구축하고 있습니다.

감사합니다.

Private WithEvents ActiveExplorerCBars As Office.CommandBars 
Private app As New Outlook.Application 

Private Sub ThisAddIn_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup 
    ActiveExplorerCBars = app.ActiveExplorer.CommandBars 
    AddHandler ActiveExplorerCBars.OnUpdate, AddressOf ActiveExplorerCBars_OnUpdate 
End Sub 

//This seems to get hit A LOT  
Private Sub ActiveExplorerCBars_OnUpdate() 
    Dim bar As Office.CommandBar 

    If IgnoreCommandbarsChanges Then Exit Sub 

    bar = ActiveExplorerCBars.Item("Context Menu") 

    If Not bar Is Nothing Then 
     Dim addMenu As Boolean = False 
     //this For loop just makes sure the context is only available when the user right-clicks over a mail item 
     For Each mail As Outlook.MailItem In Application.ActiveExplorer().Selection 
      addMenu = True 
      Exit For 
     Next 
     If addMenu Then 
      AddContextDropdown(bar) 
     End If 
    End If 
End Sub 

Private Sub AddContextDropdown(ByVal ContextMenu As Office.CommandBar) 
    Dim RootPopup As Office.CommandBarPopup 
    Dim popupTaskItem As Office.CommandBarPopup 
    RootPopup = ContextMenu.FindControl(Type:=Office.MsoControlType.msoControlPopup, Tag:="Update task") 

    If RootPopup Is Nothing Then 
     ChangingBar(ContextMenu, Restore:=False) 
     RootPopup = ContextMenu.Controls.Add(Type:=Office.MsoControlType.msoControlPopup) 

     Dim thisTaskPopup As Office.CommandBarPopup 
     popupTaskItem = ContextMenu.FindControl(Type:=Office.MsoControlType.msoControlPopup, Tag:=task.EntryID) 
     If popupTaskItem Is Nothing Then 
       popupTaskItem = RootPopup.Controls.Add(Type:=Office.MsoControlType.msoControlPopup) 
       thisTaskPopup = popupTaskItem 
       AddActionButtons(thisTaskPopup) 
     End If 
    End If 
End Sub 

Private Sub AddActionButtons(ByVal puItem As Office.CommandBarPopup) 

    Dim puDeploy As Office.CommandBarPopup = puItem.Controls.Add(Type:=Office.MsoControlType.msoControlPopup) 
    Dim btnActionItem As Office.CommandBarControl = puDeploy.Controls.Add(Type:=Office.MsoControlType.msoControlButton) 
    Dim thisButton As Office.CommandBarButton = btnActionItem 
    AddHandler thisButton.Click, AddressOf OnContextClick 
End Sub 

//Click event 
Public Sub OnContextClick(ByVal ctrl As Microsoft.Office.Core.CommandBarButton, ByRef CancelDefault As Boolean) 
    //This messagebox shows once the first time, twice the second, 3 times, etc 
    MessageBox.Show("Clicked: " & ctrl.Caption) 
End Sub 
+0

내가 잘 모르겠지만, 어쨌든, 어쩌면이 MSDN 예제 도움이 될 : http://msdn.microsoft.com/en-us/library/ms268864%28VS.80%29.aspx –

+0

MA Hanin : 답장을 보내 주셔서 감사합니다.하지만이 코드는 상단에 메뉴 모음을 추가하는 데 사용됩니다. 오른쪽 클릭을위한 컨텍스트 메뉴를 추가하려고합니다. –

+1

OnUpdate는 너의 것뿐만 아니라 술집에 대한 어떤 업데이 트에서도 호출됩니다 .... – tobrien

답변

1

알아 냈습니다.

그것은 당신이 실제로 추가 (동일 signitured) 콜백

내가 코드를 작성하는 것이 될 수있다 : 당신이 말한 곳 tobrien, 나는 특히,이 결론에 도달하기위한 수단으로 마지막 코멘트를 사용 핸들러를 추가하는 방법은 다음과 같습니다.

AddHandler thisButton.Click, AddressOf OnContextClick 

어떻게 이와 동일한 서명이 가능합니까? 자, 하나만 있습니다 OnContextClick sub ... 그래서 무엇 약 thisButton? 의 OnUpdate 당신도 알다시피, 모든 시간을 발생하는 발생할 때

For Each value As ActivityType.Request In [Enum].GetValues(GetType(ActivityType.Request)) 
     Dim btnActionItem As Office.CommandBarControl = puRequest.Controls.Add(Type:=Office.MsoControlType.msoControlButton) 
     With btnActionItem 
      .Tag = puRequest.Tag & "|" & value 
      .Caption = [Enum].GetName(GetType(ActivityType.Request), value) 
      .Visible = True 
     End With 
     Dim thisButton As Office.CommandBarButton = btnActionItem 
     AddHandler thisButton.Click, AddressOf OnContextClick 
    Next 

이 코드는 실행됩니다. 본질적으로 OnUpdate가 히트 할 때마다 OnUpdate가 발생할 때마다 단추가 기본적으로 새로 생성되고 핸들러가 메모리에 저장된다는 것을 고려하지 않고 정확한 단추에 대한 추가 처리기를 추가합니다. .

그래서, 독특한 단추 컨트롤을 만드는 데 필요한 : 확인하기 위해

.Tag = puRequest.Tag & "|" & value & "|" & Now.ToBinary().ToString() 

난 그냥 Now.ToBinary 추가의 toString()()는 .Tag 속성의 말을 할 때마다 버튼이 사용자에게 생성되면 고유 한 태그가 있습니다. 이제는 이벤트가 고유하고 클릭당 한 번만 발생합니다.

토브린, 나는 당신을 용의합니다! 궁극적으로 내 자신의 질문에 대답했지만, 그것은 당신의지도 없이는 아니 었습니다. 감사! 당신의 OnUpdate를 사용하는 이유

+0

이 게시물에 약간의 가치를 추가하십시오.여러 이벤트 처리기를 추가하지 않고도 "단일"단추에서 여러 이벤트가 발생하는 비슷한 문제에 대해 작업하고있었습니다. 문제는 여러 버튼에 대해 동일한 태그 값을 사용하여 발생하는 것으로 보입니다 (툴바 및 드롭 다운 메뉴에 버튼이 있음). 그래서 Tag 값을 독창적으로 만드는 Honus의 해결책은 제가 문제를 해결하는 방법이었습니다. – Rossco

관련 문제