2011-11-15 28 views
8

Tengo un documento WebBrowser configurado para estar en modo de edición. Estoy tratando de manipular el texto interno del elemento del cuerpo usando WebBrowser.Document.Body.InnerText, sin embargo, WebBrowser.Document.Body sigue siendo nulo.WebBrowser.Document.Body siempre es nulo

Aquí es donde el código se crea el contenido 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; 
} 

puedo editar el código y todo bien, pero yo no entiendo por qué HtmlEditor.Document.Body sigue siendo nula. Sé que siempre podría simplemente restablecer el cuerpo del documento siempre que necesite cargar texto en el formulario, pero preferiría entender por qué esto se comporta de la manera en que lo hace, si no es por el conocimiento.

Cualquier ayuda sobre esto es muy apreciada.

+0

usted los pls echar un vistazo a este enlace http://www.codeproject.com/KB/edit/editor_in_windows_forms.aspx?msg=2478179 –

+0

no hay dados, publiqué aquí después de leer ese artículo –

+0

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

Respuesta

5

Tienes que esperar a que el evento del DocumentCompleted del navegador web se active para que el DomDocument.Body no sea nulo. Acabo de probar esto para verificar. Supongo que la pregunta aún permanece: ¿cómo se puede editar a través de la interfaz COM subyacente cuando el documento no se ha cargado completamente?

Revisé para ver si los punteros IHTMLDocument2 eran los mismos en DocumentCompleted y en el constructor. Lo son, lo que podría indicar que el objeto COM subyacente reutiliza un solo objeto de documento HTML. Parece que cualquier cambio que realice en el constructor al menos tiene una buena posibilidad de sobrescribirse o lanzar una excepción.

Por ejemplo, si hago esto en el constructor, me sale un error:

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

p1.title = "Hello world!"; 

Si hago lo mismo en un manejador DocumentCompleted, que funciona bien.

Espero que esto ayude. Gracias.

2

Uso DocumentCompleted primer evento, que se produce cuando el control WebBrowser termina de cargar 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 forma sencilla:

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

Hay que dejar el control WebBrowser trabajar solo un poco para darle un tiempo para establecer la propiedad Document.Body.

Lo hago llamando al Application.DoEvents();.

Por ejemplo en el código:

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"); 
Cuestiones relacionadas