इस सवाल का लेखन शुरू करने से पहले, मैं निम्नलिखितWebBrowser नियंत्रण दस्तावेज़ का उपयोग कैसे करें C# में पूर्ण घटना?
// 1. navigate to page
// 2. wait until page is downloaded
// 3. read and write some data from/to iframe
// 4. submit (post) form
समस्या को हल करने गई थी कि यदि एक iframe एक वेब पेज पर मौजूद है, DocumentCompleted घटना तो एक बार फिर निकाल दिया जाएगा (के बाद प्रत्येक दस्तावेज़ पूरा हो चुका है कोशिश कर रहा था,)। यह अत्यधिक संभावना थी कि कार्यक्रम ने डोम से डेटा पढ़ने की कोशिश की होगी जो पूरा नहीं हुआ था और स्वाभाविक रूप से - असफल रहा।
लेकिन इस प्रश्न लिखने अचानक जबकि 'अगर' राक्षस मुझे प्रेरित है, और मैं समस्या fix'ed, कि मैं हल करने के लिए कोशिश कर रहा था। चूंकि मैं इसे Google में विफल रहा, मैंने सोचा कि इसे यहां पोस्ट करना अच्छा लगेगा।
private int iframe_counter = 1; // needs to be 1, to pass DCF test
public bool isLazyMan = default(bool);
/// <summary>
/// LOCK to stop inspecting DOM before DCF
/// </summary>
public void waitPolice() {
while (isLazyMan) Application.DoEvents();
}
private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) {
if(!e.TargetFrameName.Equals(""))
iframe_counter --;
isLazyMan = true;
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
if (!((WebBrowser)sender).Document.Url.Equals(e.Url))
iframe_counter++;
if (((WebBrowser)sender).Document.Window.Frames.Count <= iframe_counter) {//DCF test
DocumentCompletedFully((WebBrowser)sender,e);
isLazyMan = false;
}
}
private void DocumentCompletedFully(WebBrowser sender, WebBrowserDocumentCompletedEventArgs e){
//code here
}
अब कम से कम, मेरा 5 एम हैक ठीक काम कर रहा है।
शायद मैं वास्तव में Google या MSDN से पूछताछ में असफल रहा हूं, लेकिन मुझे नहीं मिल रहा है: "Webbrowser नियंत्रण दस्तावेज़ का उपयोग कैसे करें C# में पूर्ण घटना का उपयोग करें?"
टिप्पणी: वेबcontrol के बारे में बहुत कुछ सीखने के बाद, मैंने पाया कि यह फनकी सामान करता है।
भले ही आप यह पता लगाते हैं कि दस्तावेज़ पूरा हो गया है, ज्यादातर मामलों में यह हमेशा के लिए ऐसा नहीं रहेगा। पेज अपडेट कई तरीकों से किया जा सकता है - फ़्रेम रीफ्रेश, अनुरोध या सर्वर साइड पुश जैसे AJAX (आपको कुछ नियंत्रण होना चाहिए जो एसिंक्रोनस संचार का समर्थन करता है और इसमें HTML या जावास्क्रिप्ट इंटरऑप है)। इसके अलावा कुछ iframes कभी लोड नहीं होंगे, इसलिए उनके लिए हमेशा के लिए इंतजार करना सबसे अच्छा विचार नहीं है।
if (e.Url != wb.Url)
दस्तावेज़ पूर्ण घटना के दौरान IsBusy संपत्ति की स्थिति क्या है? – AMissico
जैसे ही पहला फ्रेम तैयार हो गया है, IsBusy झूठी वापसी करेगा। – Margus
बस एक नोट, आपका कोड एकाधिक सामान्य फ्रेम के साथ काम नहीं करेगा। –