2011-03-23 4 views
2

Visual C# Express 2010 (.NET Framework 4.0), Windows 7 32 비트를 사용하고 있습니다.어떻게 HTMLDocumentEvent onclick이 여러 번 발생합니까?

onclick 이벤트로 HTML 정보를 표시하는 WebBrowser 컨트롤과 ListItem 개체 만있는 WinForm 프로젝트를 만들었습니다.

내 목표는

코드

(예 : 텍스트 필드 태그 등으로) 클릭 된 HTML 문서 정보를 프로젝트를 실행하고 WebBrowser 컨트롤에 웹 사이트에서 텍스트 필드를 클릭하고 표시하는 것입니다
namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 

     private mshtml.HTMLDocument doc = null; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
     object oUrl = "http://livemocha.com/"; 
     object oEmpty = ""; 
     myBrowser.Navigate(oUrl.ToString()); 

     } 


     private void myBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      try 
      { 
       doc = (mshtml.HTMLDocument)myBrowser.Document.DomDocument; 
       mshtml.HTMLDocumentEvents2_Event iEvent = (mshtml.HTMLDocumentEvents2_Event)doc; 

       iEvent.onclick += new HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler); 

      } 
      catch (UnauthorizedAccessException err) 
      { 
       Console.WriteLine("OOPS: " + err); 
      } 

     } 

     //event handler when user clicks mouse 
     //and just display info such as html tag and its attributes 
     private bool ClickEventHandler(mshtml.IHTMLEventObj e) 
     { 
      actionList.Items.Add("------- ClickEventHandler -----------"); 

      actionList.Items.Add(e.type + " : " + e.srcElement.tagName + " : " + e.srcElement.outerHTML + " : " + e.srcElement.innerText + " : " + e.srcElement.id); 

      return true; 
     } 
    }//end class 
}//end namespace 

문제가 발생하는 동안 ListItem 개체는 ClickEventHandler에 의해 생성 된 동일한 출력을 표시합니다. 내가 검색 텍스트 필드에 www.google.com 단지 마우스 클릭으로 이동하는 경우 예를 들어, 출력은 다음과 같습니다 등등

----- ClickEventHandler --------- 
click: INPUT <INPUT style=..... 
----- ClickEventHandler --------- 
click: INPUT <INPUT style=..... 
----- ClickEventHandler --------- 
click: INPUT <INPUT style=..... 

합니다. 클릭 이벤트는 여러 번 발생합니다.

내가 여기에 예를 따랐습니다

: 온 클릭 http://support.microsoft.com/kb/312777

내가 myBrowser_DocumentCompleted()를 생각했다가 호출 될 때 여러 번 어떻게 든하고 라인에 동일한 이벤트 핸들러를 추가,

iEvent.onclick += new HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler); 

그러나 HTMLDocumentEvents2_Event 방법 등()은 + = 또는 - = 만 허용하므로이 행을 변경할 수는 없습니다.

누구에게이 문제가 발생 했습니까?

UPDATE는

WebBrowser 컨트롤의 URL이 처음 www.msn.com에 프로젝트가 실행될 때, documentCompleted 이벤트가 호출 설정 한 후 이벤트 핸들러를 클릭 추가되는 것을 나타냈다.

클릭 이벤트 처리기를 추가하는 다른 URL로 이동하는 FormLoad() 이벤트.

이제는 두 번의 클릭 이벤트 처리기가 있습니다.

또한 다른 URL로 갈 때마다 어떻게 든 클릭 이벤트 처리기가 추가되고 있습니다.

documentCompleted() event, iEvent가 올바르게 지워지지 않았 음을 확신합니다. (코드를 살펴보면 documentCompleted() 이벤트 당 초기화되므로 ...)

+0

중복 이벤트 핸들러를 추가 할 수있는 다른 사이트로 이동이의 Form_Load 같은데 ...? –

+0

체격, 첫 번째, 나를 다른 사이트로 안내하는 form_load는 중복 클릭 이벤트 처리기를 추가합니다.하지만 문서가 없으면 무언가가 문서 완료 이벤트 처리기 안에 없기 때문에 여전히 이벤트 처리기를 추가합니다. 코드는 괜찮은 것 같습니다 .hmm –

답변

4

몇 시간을 보낸 후, 나는 때마다이 페이지에 관계없이 다시로드 것으로 생각되는 URL에, documentCompleted() 이벤트가 트리거되고 동일한 clickEvent()가 iEvent에 추가됩니다.

해결 방법은 doc가 null인지 확인하는 것입니다.

private void myBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      try 
      { 
       if (doc == null) 
       { 
        doc = (mshtml.HTMLDocument)myBrowser.Document.DomDocument; 
        mshtml.HTMLDocumentEvents2_Event iEvent = (mshtml.HTMLDocumentEvents2_Event)doc; 

        iEvent.onclick += new HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler); 
        iEvent.onkeypress += new HTMLDocumentEvents2_onkeypressEventHandler(KeyStrokeEventHandler); 
       } 
      } 
      catch (UnauthorizedAccessException err) 
      { 
       Console.WriteLine("OOPS: " + err); 
      } 
     } 

저는 이것이 최선의 해결책이라고 확신하지는 않지만 현재로서는이 방법이 효과적입니다. (왜이 추가되었다 확실하지 여전히 비록 clickEventiEvent마다 다시 초기화하지만 documentCompleted() 전화.

+0

게시 해 주셔서 감사합니다. 나는 다른 코드 예제에서 null 체크를 보았지만 그것이 왜 있는지는 알지 못했다. – gb2d

+0

아주 오래된 스레드지만 @ masato-san 감사합니다. 나는 같은 문제 (C++)에서 몇 시간을 보냈다. 여러 프레임 (또는 DHTML) 때문에 DocumentComplete는 "일부"내용을 표시 할 준비가 되 자마자 여러 번 실행됩니다. 그래서 DocumentComplete 내부에 구독 된 추가 이벤트는 미친 듯이 곱 해졌습니다. :) – user1797147

2

디버깅하여 이벤트 핸들러에 중단 점을 설정하십시오. 귀하의 질문에 웹 사이트를 다시 작성할 수는 없지만 이것은 그렇지 않을 가능성이 있습니다. DocumentCompleted는 웹 페이지의 각 프레임에 대해 실행됩니다. 여러 개가있을 수 있습니다.이미 이벤트를 가입 한 것을 추적하는 부울 필드를 사용에서 짧은, 당신은 또한이 같은 프레임을 필터링 할 수 있습니다 :

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { 
     if (e.Url != webBrowser1.Url) return; 
     // etc.. 
    } 
+0

완전히 잊어 버렸습니다. 디버거에 대해! thx 내가 그걸 시험해 볼게. –

+0

디버거에 익숙하지 않지만 사용했을 때마다 documentCompleted()가 트리거 될 때마다 iEvent가 할당 될 때까지 iEvent가 null로 설정됩니다. 중복 클릭 이벤트 .. 흠 너무 필터링 해 보겠습니다. –

관련 문제