none
WebBrowser.Navigate取得頁面資料後,觸發DocumentCompleted事件後等相關問題 RRS feed

  • 問題

  • foreach (ParserDataSet.WebsideRow dr in websideDataTable)
                {
                    if (twvDataTable.Count > 0)
                    {
                        var temp = from v in twvDataTable where v.WebSideId == dr.Id select new { v.TeacherId,  v.Value, v.ParserTag };
                        var list = temp.ToList();
                        for (int i = 0; i < list.Count; i ++ )
                        {
                            int teacherId = listIdea.TeacherId;
                            string teacherName = (from t in teacherDataTable where t.Id == teacherId select t.Name).First();
                            webBrowser.Navigate(dr.ParserURL + dr.Tag + "=" + listIdea.Value);
                            webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);
                        }
                    }
                    else
                    {throw new Exception("沒有設定網站老師資料");}
                }
    在上述條件擷取到網頁後
    觸發
    webBrowser_DocumentCompleted這個Method時
    我要如何抓到
    teacherId,teacherName呢?
    麻煩各位大大指導一下
    2008年7月1日 上午 02:49

解答

  • 把這行webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted

    放到迴圈外吧,不要放迴圈內.

     

    記得之前寫過一段"BUG",因為我也是放在迴圈內,原本應該只要觸發一次,但因為迴圈的關係,加了N次,所以只要一觸發,它就重覆跑N次.

     

    如果你的網頁資料是不需要顯示,要不要用WebClient做看看~

    2008年7月2日 上午 09:17

所有回覆

  • (1) 可以存在全域變數
    (2) 將 id 與 name 帶入 Naviagte() 的 URL 中當作 Querystring
    2008年7月1日 上午 03:13
  • Dear chhuang 大哥
    嗯 上述方法的確可以解決此問題
    但還有沒有其他方法呢?
    原本我想要自己實做EventArgs
    但是事件觸發的時間點我無法控制
    導致我無法傳自己實做的
    EventArgs進去
    2008年7月1日 上午 03:20
  • 看你把webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);

    放在迴圈裡去.

     

    你要不要試看看,當迴圈跑了2次以上,而這行也執行到了兩次以上,會觸發webBrowser_DocumentCompleted幾次?

    2008年7月2日 上午 06:50
  • Dear Jeff Yeh大大
    總共會跑兩次

    其實需求很簡單
    我將要擷取的網頁網址存到資料庫中
    透過迴圈的方式
    去擷取該網頁的資料
    經過篩選後跑後續的流程
    但篩選的條件就是teacherId,teacherName,ParserTag
    2008年7月2日 上午 08:24
  • 把這行webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted

    放到迴圈外吧,不要放迴圈內.

     

    記得之前寫過一段"BUG",因為我也是放在迴圈內,原本應該只要觸發一次,但因為迴圈的關係,加了N次,所以只要一觸發,它就重覆跑N次.

     

    如果你的網頁資料是不需要顯示,要不要用WebClient做看看~

    2008年7月2日 上午 09:17
  • Dear   Jeff Yeh大大

    我的網頁資料指是做擷取資料用
    然後把資料存到資料庫去
    有沒有更減量的功能阿?
    還是大大可以大概DEMO 一段WebClient擷取某一個網頁的Code呢?

    PS( 某些網頁需要登入功能,不知道WebClient可不可以達到此效果?)
    2008年7月2日 上午 10:01
  • WebClient wc = new WebClient();
                NameValueCollection nvc = new NameValueCollection();
               
                if (textBox1.Text.Trim().Length > 0)
                {
                    nvc.Add("target",  textBox1.Text.Trim());
                    wc.QueryString = nvc;
                    wc.Encoding=Encoding.UTF8;
                    wc.DownloadFile("http://shopping.pchome.com.tw/lib/search/search.php", "Pro.htm");
                }

     

    當然,你也可以wc.DownloadString(url);

     

    MSDN : WebClient

    2008年7月3日 上午 12:55
  • Dear Jeff Yeh大大
    我剛剛有測試過
    WebClient效能上真的快很多
    但是碰到一個問題了
    我宣告一個全域變數
    在外層的for 迴圈改變全域變數的值
    但是當觸發Completed的時候
    抓到的全域變數都是第一個回圈的全域變數值
    有甚麼方法可以解決呢?
    2008年7月3日 上午 08:51
  • 沒程式碼,我也不知道你怎麼寫的....或許這種邏輯問題,你可以再想一下,應該你的聰明腦袋會有答案出來的.

    2008年7月3日 上午 08:56