Pregunta

Estoy tratando de cargar un documento html en un control WebBrowser, pero estoy en mi punto final. Aquí hay una muestra:

public void Button_Click(object sender, EventArgs e)
{
    webBrowser1.DocumentCompleted += new  WebBrowserDocumentCompletedEventHandler(wb_c);
    webBrowser1.DocumentText = "<html>foo</html>";

    // The documenttext property is NOT what was set above.  
    // No exception is thrown.  It's always "<html></html>\0", however.
    // This line setting the title throws a HRESULT COM error.
    webBrowser1.Document.Title = "foobar!";
}

El controlador de eventos wb_c tampoco se llama nunca. El control del navegador web se define como un control en el formulario. El formulario en sí consta solo del navegador y del botón.

¿Alguien tiene alguna idea? He usado esta clase antes sin ningún problema, ¡pero esta vez los dioses .Net me están negando! Mi objetivo final es imprimir el documento renderizado, pero en este momento ni siquiera puedo hacer que acepte mi HTML. Tal vez necesito un poco de agua bendita o algo así.

Editar: si la línea de título se elimina arriba, el controlador de eventos wb_c nunca se activará. Es como si hubiera algún problema con el componente COM en sí mismo o algo así.

Edit 2: Por demanda popular, aquí hay un blob completo de mi código.

public partial class Form2 : Form
{
    [STAThread]
    public static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form2());
    }


    public Form2()
    {
        InitializeComponent();
        webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_c);
    }

    void wb_c(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        throw new Exception("The method or operation is not implemented.");
    }

    private void button1_Click(object sender, EventArgs e)
    {
        webBrowser1.DocumentText = "<html>foo</html>";
    }
}



partial class Form2
{
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    #region Windows Form Designer generated code

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
        this.webBrowser1 = new System.Windows.Forms.WebBrowser();
        this.button1 = new System.Windows.Forms.Button();
        this.SuspendLayout();
        // 
        // webBrowser1
        // 
        this.webBrowser1.Location = new System.Drawing.Point(12, 12);
        this.webBrowser1.MinimumSize = new System.Drawing.Size(20, 20);
        this.webBrowser1.Name = "webBrowser1";
        this.webBrowser1.Size = new System.Drawing.Size(117, 99);
        this.webBrowser1.TabIndex = 0;
        // 
        // button1
        // 
        this.button1.Location = new System.Drawing.Point(90, 165);
        this.button1.Name = "button1";
        this.button1.Size = new System.Drawing.Size(75, 23);
        this.button1.TabIndex = 1;
        this.button1.Text = "button1";
        this.button1.UseVisualStyleBackColor = true;
        this.button1.Click += new System.EventHandler(this.button1_Click);
        // 
        // Form2
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(292, 266);
        this.Controls.Add(this.button1);
        this.Controls.Add(this.webBrowser1);
        this.Name = "Form2";
        this.Text = "Form2";
        this.Load += new System.EventHandler(this.Form2_Load);
        this.ResumeLayout(false);

    }

    #endregion

    private System.Windows.Forms.WebBrowser webBrowser1;
    private System.Windows.Forms.Button button1;
}

Este es un proyecto .Net 2.0 que se ejecuta en VS 2005. System.Windows.Forms.dll es v2.0.50727.

EDIT 3: agregando esta línea al final del constructor Form2:

webBrowser1.Navigate("about:blank");

¿ activa el controlador de eventos, pero no afecta el comportamiento del código al configurar el texto del documento. Al establecer un punto de interrupción después de la línea webBrowser1.Document.Text, aparece el mismo " \ 0 " cadena, y tratando de establecer el título todavía da un COM HERROR.

¿Fue útil?

Solución

Intenta mover la línea:

webBrowser1.Document.Title = "foobar!";

en su método wb_c. Creo que el problema es que cuando lo llamas, la propiedad Document todavía no está completamente establecida y obtienes una excepción de referencia nula. Si esperas hasta que se cargue la página, deberías estar bien.

ACTUALIZACIÓN: Probé tu muestra y tu controlador de eventos SE LLAMÓ, sin embargo, sospecho que se está llamando desde otro hilo. Por lo tanto, llega a la línea donde se lanza la Excepción, pero en realidad nunca la ves, porque está en otro hilo. Saque la línea que lanza la excepción y reemplácela con:

<*>

Eso debería hacer el truco.

Otros consejos

Antes de que pueda manipular el documento, necesita ejecutar el comando de navegación. Para usar el WebBrowser para construir una página HTML desde cero, simplemente navegue hasta " about: blank " así:

WebBrowser browser = new WebBrowser();
browser.Navigate("about:blank");
browser.Document.Write(html);

Luego, usa InnerHtml en el elemento raíz y no la propiedad DocumentText para aplicar Html tal como eres.

La carga del documento es asíncrona, por lo tanto, cuando establece el Título, no hay ninguna garantía de que el documento se haya cargado realmente. Debe manejar los eventos apropiados del navegador para detectar cuándo se completa la navegación antes de intentar modificar el documento.

Actualizar

En todas las situaciones en las que he usado el navegador, he tenido que navegar a la página about: blank antes de poder modificar el documento. Quizás deberías intentar esto antes de configurar el DocumentText .

Utilizo el método anterior que usa about: blank y funciona bien. Ayer publiqué un artículo sobre este método y hoy he encontrado este tema aquí :) Mi artículo aquí: http://starikovs.com/2009/11 / 25 / set-html-webbrowser-csharp /

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top