2012-09-07 48 views
3

這是我有:如何在事件處理程序內的WebBrowser上調用方法?

public void initiate(WebBrowser browser) 
{   
    browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(refDocumentCompleted); 
    // navigate browser to the referal Uri 
    browser.Navigate(refreral); 

    browser.DocumentCompleted -= refDocumentCompleted; 
    //remove here so that it doesn't do this everytime a document is completed, i want it just in this method 
} 

private void refDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    // want to call navigate method on browser here. but Its out of scope. 
} 

我想它做的是,導航到referral,那麼一旦被加載瀏覽存儲在類的全局字符串另一頁。

我敢肯定,在這裏我的麻煩是從事件是如何工作的,我試着讀了它缺乏瞭解,但似乎無法讓我的周圍的頭,但不認爲我需要創建自己的處理程序。

回答

2

你已經擁有的web瀏覽器對象。你只需要投它:

((WebBrowser)sender).Navigate(...); 

+1

鑄造,這就是我失蹤。 – user1655759

0

在你initiate方法商店WebBrowser在一個實例字段,然後從事件處理函數中引用它:

private WebBrowser _browser; 

// inside initiate 
_browser = browser; 

// Inside event handler 
_browser.Navigate(...); 
+0

那麼,你*可以*避免事件處理程序方法,並使用lambda表達式來代替 - 這會讓你訪問瀏覽器實例。儘管如此,我認爲它並不乾淨。 – zmbq

+0

好吧,我想這alloud我做什麼我就問,但它仍然沒有做什麼,我想,因爲它移除處理程序的事件發生之前。 – user1655759

0

使用lambda表達式,如:

public void initiate(WebBrowser browser) 
{ 

    browser.DocumentCompleted += (sender, e) => { 
     browser.DoStuff(); // it's in scope via closure 
    }; 

    // etc 
} 

編輯:添加/刪除它,拉姆達分配給一個變量:

public void initiate(WebBrowser browser) 
{ 

    var doStuff = (sender, e) => { 
     browser.DoStuff(); // it's in scope via closure 
    }; 

    browser.DocumentCompleted += doStuff; 

    // etc 

    browser.DocumentCompleted -= doStuff; 
} 
+0

這就是我最初的方式,但是,我將如何刪除它? – user1655759

+0

將閉包創建爲變量,然後添加並刪除它。答覆已更改。 – robrich

相關問題