2011-11-15 41 views
8

Ho un documento WebBrowser impostato in modalità di modifica. Sto cercando di manipolare il testo interno dell'elemento body usando WebBrowser.Document.Body.InnerText, tuttavia, WebBrowser.Document.Body rimane nullo.WebBrowser.Document.Body è sempre nullo

Ecco il codice in cui creo il contenuto del documento:

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; 
} 

posso modificare il codice e tutto bene, ma non capisco il motivo per cui HtmlEditor.Document.Body rimane nullo. So che potrei sempre resettare il corpo del documento ogni volta che ho bisogno di caricare del testo nel modulo, ma preferirei capire perché questo si sta comportando come è, se non altro per la conoscenza.

Qualsiasi aiuto su questo è molto apprezzato.

+0

sarebbe pls dare un'occhiata a questo link http://www.codeproject.com/KB/edit/editor_in_windows_forms.aspx?msg=2478179 –

+0

no dice, ho postato qui dopo aver letto l'articolo –

+0

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

risposta

5

È necessario attendere che l'evento DocumentCompleted del browser Web venga attivato affinché lo DomDocument.Body non sia null. Ho appena provato questo per verificare. Suppongo che la domanda resti ancora: come è possibile modificare tramite l'interfaccia COM sottostante quando il documento non è stato caricato completamente?

Ho controllato per vedere se i puntatori IHTMLDocument2 erano gli stessi in DocumentCompleted e il costruttore. Sono, il che potrebbe indicare che l'oggetto COM sottostante riutilizza un singolo oggetto documento HTML. Sembra che qualsiasi modifica apportata al costruttore abbia almeno una buona probabilità di sovrascrivere o generare un'eccezione.

Per esempio, se faccio questo nel costruttore, ottengo un errore:

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

p1.title = "Hello world!"; 

Se faccio lo stesso in un gestore DocumentCompleted, funziona benissimo.

Spero che questo aiuti. Grazie.

2

Usa DocumentCompleted primo evento, che si verifica quando il controllo WebBrowser finisce di caricare un documento:

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; 
} 

o un modo semplice:

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

È necessario lasciare il controllo WebBrowser di lavorare da solo un po ' per dargli un po 'di tempo per impostare la proprietà Document.Body.

Lo faccio chiamando lo Application.DoEvents();.

Per esempio nel codice:

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"); 
Problemi correlati