2011-11-15 16 views
8

मेरे पास WebBrowser दस्तावेज़ संपादन मोड में सेट होने के लिए सेट है। मैं WebBrowser.Document.Body.InnerText का उपयोग कर शरीर तत्व के आंतरिक पाठ में हेरफेर करने की कोशिश कर रहा हूं, हालांकि, WebBrowser.Document.Body शून्य बना हुआ है।WebBrowser.Document.Body हमेशा शून्य

यहाँ कोड है, जहां मैं दस्तावेज़ सामग्री बनाने है:

private WebBrowser HtmlEditor = new WebBrowser(); 
public HtmlEditControl() 
{ 
    InitializeComponent(); 
    HtmlEditor.DocumentText = "<html><body></body></html>"; 
    myDoc = (IHTMLDocument2)HtmlEditor.Document.DomDocument; 
    myDoc.designMode = "On"; 
    HtmlEditor.Refresh(WebBrowserRefreshOption.Completely); 
    myContentsChanged = false; 
} 

मैं कोड और सब कुछ ठीक संपादित कर सकते हैं, लेकिन मुझे समझ नहीं आता क्यों HtmlEditor.Document.Body अशक्त बना हुआ है। मुझे पता है कि जब भी मुझे फॉर्म में टेक्स्ट लोड करने की ज़रूरत होती है, तो मैं हमेशा दस्तावेज़ निकाय को रीसेट कर सकता हूं, लेकिन मुझे यह समझना अच्छा लगेगा कि यह किस तरह से व्यवहार कर रहा है, अगर ज्ञान के लिए कुछ और नहीं है।

इस पर किसी भी मदद की सराहना की जाती है।

+0

आप कृपया इस लिंक http://www.codeproject.com/KB/edit/editor_in_windows_forms.aspx?msg=2478179 –

+0

पर एक नज़र ले जाएगा कोई पासा नहीं, मैंने उस आलेख को पढ़ने के बाद यहां पोस्ट किया है –

+0

http://weblogs.asp.net/gunnarpeipman/archive/2009/08/15/displaying-custom-html-in-webbrowser-control.aspx –

उत्तर

5

आपको वेब ब्राउज़र के DocumentCompleted ईवेंट के लिए DomDocument.Body के लिए आग लगने के लिए आग लगनी पड़ेगी। मैंने अभी सत्यापित करने के लिए इसका परीक्षण किया। मुझे लगता है कि सवाल अभी भी बनी हुई है: जब दस्तावेज़ पूरी तरह से लोड नहीं हुआ है तो आप अंतर्निहित COM इंटरफ़ेस के माध्यम से कैसे संपादित कर सकते हैं?

मैंने यह देखने के लिए जांच की कि IHTMLDocument2 पॉइंटर्स दस्तावेज़ पूर्ण और कन्स्ट्रक्टर में समान थे या नहीं। वे हैं, जो संकेत दे सकते हैं कि अंतर्निहित COM ऑब्जेक्ट एक HTML दस्तावेज़ ऑब्जेक्ट का पुन: उपयोग करता है। ऐसा लगता है कि आप कन्स्ट्रक्टर में किए गए किसी भी बदलाव को कम से कम ओवरराइट करने या अपवाद फेंकने का एक अच्छा मौका देते हैं।

IHTMLDocument2 p1 = (IHTMLDocument2) HTMLEditor.Document.DomDocument; 

p1.title = "Hello world!"; 

अगर मैं एक DocumentCompleted हैंडलर में भी ऐसा ही है, यह ठीक काम करता है:

उदाहरण के लिए, अगर मैं निर्माता में ऐसा करते हैं, मैं कोई त्रुटि मिलती है।

उम्मीद है कि इससे मदद मिलती है। धन्यवाद।

2

उपयोग DocumentCompleted घटना पहले, यह तब होता है जब WebBrowser नियंत्रण एक दस्तावेज़ लोड खत्म:

public HtmlEditControl() 
{ 
    InitializeComponent(); 
    HtmlEditor.DocumentText = "<html><body></body></html>"; 
    HtmlEditor.DocumentCompleted += HtmlEditorDocumentCompleted; 
} 

void HtmlEditorDocumentCompleted(object sender, 
           WebBrowserDocumentCompletedEventArgs e) 
{ 
    myDoc = (IHTMLDocument2)((WebBrowser)sender).Document.DomDocument; 
    myDoc.designMode = "On"; 
    HtmlEditor.Refresh(WebBrowserRefreshOption.Completely); 
    myContentsChanged = false; 
} 

या आसान तरीका:

public HtmlEditControl() 
{ 
    InitializeComponent(); 
    HtmlEditor.DocumentText = "<html><body></body></html>"; 
    HtmlEditor.DocumentCompleted += (sender, e) => 
      { 
       myDoc = (IHTMLDocument2) HtmlEditor.Document.DomDocument; 
       myDoc.designMode = "On"; 
       HtmlEditor.Refresh(WebBrowserRefreshOption.Completely); 
       myContentsChanged = false; 
      }; 
} 
0

तुम अकेले एक सा काम करने के लिए WebBrowser नियंत्रण होने देना होता है Document.Body संपत्ति सेट करने के लिए कुछ समय देने के लिए।

मैं Application.DoEvents(); पर कॉल करके ऐसा करता हूं।

अपने कोड में उदाहरण के लिए:

private WebBrowser HtmlEditor = new WebBrowser(); 
public HtmlEditControl() 
{ 
    InitializeComponent(); 
    HtmlEditor.DocumentText = "<html><body></body></html>"; 

    // Let's leave the WebBrowser control working alone. 
    while (HtmlEditor.Document.Body == null) 
    { 
     Application.DoEvents(); 
    } 

    myDoc = (IHTMLDocument2)HtmlEditor.Document.DomDocument; 
    myDoc.designMode = "On"; 
    HtmlEditor.Refresh(WebBrowserRefreshOption.Completely); 
    myContentsChanged = false; 
} 
0
if (HtmlEditor.Document.Body == null) 
{ 
    HtmlEditor.Document.OpenNew(false).Write(@"<html><body><div id=""editable""></div></body></html>"); 
} 
HtmlEditor.Document.Body.SetAttribute("contentEditable", "true"); 
संबंधित मुद्दे