2011-03-02 6 views
5

के बाद पृष्ठ को पुनः लोड करना मैं एक साधारण एप्लिकेशन पर काम कर रहा हूं जो स्वचालित रूप से उस पृष्ठ में ब्राउज़ करता है जिसमें दो ड्रॉपडाउन मेनू और बटन होता है। पेज इस तरह दिखता है:सी # webBrowser.Document: पोस्टबैक

------ DropDown1 -------

------ DropDown2 -------

- ----- बटन ---------

अब, समस्या है, DropDown2 की सामग्री को गतिशील Dropdown1 के चयन से उत्पन्न होता है।

मैं सी # में इस तरह कोड लिखा है:

private void webBrowser1_DocumentCompleted(object sender, 
     WebBrowserDocumentCompletedEventArgs e) 
{ 
    HtmlElement elem = webBrowser1.Document.GetElementById("DropDown1"); 
    elem.SetAttribute("selectedIndex", "1"); 
    elem.RaiseEvent("onChange"); 
    HtmlElement elem = webBrowser1.Document.GetElementById("DropDown2"); 
    elem.SetAttribute("selectedIndex", "5"); 
    elem.RaiseEvent("onChange"); 
} 

onChange घटना को ऊपर उठाने के बाद, ब्राउज़र नए मूल्यों को लोड करता है, लेकिन मैं नहीं मिलता है और DropDown2 मूल्य निर्धारित कर सकते हैं क्योंकि अभी भी दस्तावेज़ DropDown2 रों मूल्यों सोचता है खाली हैं

DropDown2 में जेनरेट किए गए नए मान कैसे प्राप्त और सेट कर सकते हैं?

उत्तर

2

मुझे चेंज इवेंट को बढ़ाने के बाद "__doPostBack" स्क्रिप्ट का आह्वान करके समाधान मिला है। जब मैं doPostBack को आमंत्रित करता हूं, तो दस्तावेज़ पुनः लोड होता है और इसलिए मैं नए मान पुनर्प्राप्त कर सकता हूं। कोड का पालन करता है:

private void BeginOperation() 
    { 
     webBrowser1.Navigate("somewebpage", false); 
     Task = 0; 
    } 
    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     HtmlElement elem; 

     switch (Task) 
     { 
      case 0: 
       //HtmlDocument mydoc = webBrowser1.Document; 
       elem = webBrowser1.Document.GetElementById("ddlCity"); 
       MessageBox.Show(elem.All.Count.ToString()); 
       elem.SetAttribute("selectedIndex", "1"); 
       //elem.RaiseEvent("onChange"); 
       object[] args = {"someparameters"}; 
       webBrowser1.Document.InvokeScript("__doPostBack",args); 
       Task++; 
      break; 
      case 1: 
       elem = webBrowser1.Document.GetElementById("ddlDistrict"); 
       elem.SetAttribute("selectedIndex", "2"); 
       elem.RaiseEvent("onChange"); 
       object[] args2 = {"someparameters"}; 
       webBrowser1.Document.InvokeScript("__doPostBack",args2); 
       Task++; 
      break; 
     } 
    } 
0

मुझे संदेह है कि आप जिस समस्या का सामना कर रहे हैं वह यह है क्योंकि आपके द्वारा लिखे गए कोड में पोस्टबैक होने की प्रतीक्षा नहीं है। तो क्या होता है ....

 
|---> The page finishes loading, triggering your DocumentCompleted method 
|---> You set the selectedIndex on DropDown1 
|---> You raise the onChange event for DropDown1 
|  |---> The page starts posting-back (1) 
|---> You (attempt to) set the selectedIndex on DropDown2 
|---> You raise the onChange event for DropDown2 
|  |---> The page starts posting-back (2) 
| 
... 
... 
... 
|---> The page finishes re-loading from from postback (2) 

असल में, आप क्या करना पेज फिर से लोड करने के लिए के लिए पोस्टबैक ट्रिगर करने के बाद इंतजार कर रहा है की जरूरत क्या है। ऐसा करने के लिए सुरुचिपूर्ण, भंगुर और लगभग निश्चित रूप से कुछ काम करने का तरीका Timer, या इसी तरह ट्रिगर करना है, ताकि समय के बाद (जब तक पोस्टबैक होता है) तब आप चयनित इंडेक्स सेट करना जारी रख सकते हैं DropDown2 के लिए। बेहतर विकल्प इस तरह कुछ करने के लिए होगा:

 
|---> The page finishes loading, triggering your DocumentCompleted method 
|---> You attach a new EventHandler to DocumentCompleted that contains the 
|  code for changing the selectedIndex on DropDown2 and REMOVE this 
|  eventhandler 
|---> You set the selectedIndex on DropDown1 
|---> You raise the onChange event for DropDown1 
|---> Your code in the DocumentCompleted handler finishes executing 


|---> // This is the DocumentCompleted handler that you assign above 
|---> You set the selectedIndex on DropDown2 
|---> You raise the onChange event for DropDown2 
|---> Your code in the DocumentCompleted handler finishes executing 

ऐसा करने के और अधिक सुरुचिपूर्ण तरीके हैं, लेकिन यह शायद सबसे सरल व्याख्या करने के लिए है।

+0

मैंने इसके बारे में भी सोचा लेकिन "दस्तावेज़ पूर्ण" हैंडलर पोस्टबैक के बाद नहीं चलता है। DropDown1 में किसी आइटम का चयन करना DropDown2 को पॉप्युलेट करने के लिए बस एक फ़ंक्शन को सक्रिय करता है। इसलिए दस्तावेज एक बार निकाल दिया जाता है। इसके अलावा एक और नोट, जब मैं सिस्टम के साथ चेंज के बाद देरी करता हूं। थ्रेडिंग। थ्रेड। सो (5000); धागा सिर्फ 5 सेकंड के लिए पोस्टबैक खत्म करने की प्रतीक्षा करता है और यह काम नहीं करता .. कोई अन्य सुझाव? – dreampowder

0

इसके लिए धन्यवाद। मैं दिनों के लिए इसी तरह की समस्या का हल ढूंढ रहा हूं ... मेरे मामले में, मेरे पास एक ड्रॉपडाउन मेनू था जिसके लिए सूची में आइटम "बदले" ईवेंट के दौरान अपडेट किए गए थे। _ _doPostBack को आमंत्रित करने से WebBrowserReadyState अद्यतन करता है जो मुझे "ड्रॉपचेंज" ईवेंट को नए ड्रॉपडाउन सूची मानों को स्क्रैप करने से पहले पूरा करने की अनुमति देता है।

+0

आप अच्छे हैं, मुझे खुशी है कि मैं मदद कर सकता हूं – dreampowder