Pergunta

Eu estou tentando carregar um documento HTML em um controle WebBrowser, mas estou no meu juízo final. Aqui está um exemplo:

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

O manipulador de eventos wb_c nunca é chamado, também. O controle webbrowser é definido como um controlo no formulário. A forma em si consiste de apenas o navegador eo botão.

Alguém tem alguma idéia? Eu usei essa classe antes, sem quaisquer problemas, mas desta vez os deuses .Net estão me negando! Meu objetivo final é imprimir o documento renderizado, mas agora eu não posso mesmo obtê-lo a aceitar o meu HTML. Talvez eu precise de um pouco de água benta ou algo assim.

Edit: Se a linha de Título é removida acima, o manipulador de eventos wb_c nunca está sendo acionado. É como se há algo errado com o componente COM em si, ou algo assim.

Edit 2:. Por demanda popular, aqui é uma gota completa do meu 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 é um projecto Net 2.0 em execução no VS 2005. System.Windows.Forms.dll é v2.0.50727.

EDIT 3: Adicionando esta linha ao final do construtor Form2:

webBrowser1.Navigate("about:blank");

O acionar o manipulador de eventos, mas não de outra forma afetar o comportamento do código ao definir o texto do documento. Definir um ponto de interrupção após a linha webBrowser1.Document.Text ainda dá o mesmo "\ 0" string, e tentar definir o título ainda dá uma herror COM.

Foi útil?

Solução

Tente mover a linha:

webBrowser1.Document.Title = "foobar!";

em seu método wb_c. Eu acho que o problema é que quando você está chamando-o, a propriedade Document não está definido completley ainda, e você está recebendo uma exceção de referência nula. Se você esperar até que a página é carregada, você deve estar ok.

UPDATE: tentou sua amostra, e seu manipulador de eventos está sendo chamado, no entanto eu suspeito que está sendo chamado de outro segmento. Portanto, torna-se para a linha onde a exceção é lançada, mas você nunca está realmente vê-lo, porque está em outro segmento. Retire a linha que lança a exceção, e substituí-lo:

webBrowser1.Document.Title = "foobar!";

Isso deve fazer o truque.

Outras dicas

Antes de poder manipular o documento que você precisa para executar o comando navegar. Para usar o WebBrowser para construir uma página HTML a partir do zero apenas vá para "about: blank" assim:

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

Em seguida, use o InnerHtml no elemento raiz e não a propriedade DocumentText aplicar Html como você é.

Documento de carga é tão assíncrona pelo tempo que você definir o título, não há garantia de que o documento foi realmente carregado. Você precisa lidar com os eventos do navegador apropriados para detectar quando a navegação está completo antes de tentar alterar o documento.

Atualização

Em todas as situações em que usei o navegador, eu tive para navegar até a página about:blank primeiro antes que eu pudesse modificar o documento. Talvez você devesse tentar isso antes de definir a DocumentText.

Eu uso o método acima que os usos about: blank e funciona ok! Eu publicou um artigo sobre este método ontem e hoje eu apenas encontrei este tema aqui :) Meu artigo aqui: http://starikovs.com/2009/11 / 25 / set-html-webbrowser-csharp /

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top