веб-браузер не загружает документ - PullRequest
4 голосов
/ 04 мая 2009

Я пытаюсь загрузить html-документ в элемент управления WebBrowser, но у меня все в порядке. Вот образец:

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

Обработчик события wb_c также никогда не вызывается. Элемент управления веб-браузера определяется как элемент управления в форме. Сама форма состоит только из браузера и кнопки.

У кого-нибудь есть идеи? Я использовал этот класс раньше без каких-либо проблем, но на этот раз .Net боги меня отрицают! Моя конечная цель - напечатать отрендеренный документ, но сейчас я даже не могу заставить его принять мой HTML. Может, мне нужна святая вода или что-то в этом роде.

Редактировать: Если строка заголовка удалена выше, обработчик события wb_c никогда не запускается. Как будто что-то не так с самим компонентом COM или что-то в этом роде.

Редактировать 2: По многочисленным просьбам, вот полный фрагмент моего кода.

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

Это проект .Net 2.0, запущенный в VS 2005. System.Windows.Forms.dll: v2.0.50727.

РЕДАКТИРОВАТЬ 3: Добавление этой строки в конец конструктора Form2:

webBrowser1.Navigate("about:blank");

Активирует ли обработчик события, но это никак не влияет на поведение кода при настройке текста документа. Установка точки останова после строки webBrowser1.Document.Text по-прежнему дает ту же строку «\ 0», а попытка установить заголовок по-прежнему дает COM HERROR.

Ответы [ 4 ]

6 голосов
/ 19 мая 2009

Прежде чем вы сможете манипулировать документом, вам нужно выполнить команду навигации. Чтобы использовать WebBrowser для создания HTML-страницы с нуля, просто перейдите к "about: blank" примерно так:

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

Затем используйте InnerHtml в корневом элементе, а не свойство DocumentText, чтобы применить Html таким, какой вы есть.

3 голосов
/ 04 мая 2009

Попробуйте переместить строку:

webBrowser1.Document.Title = "foobar!";

в ваш метод wb_c. Я думаю, проблема в том, что когда вы вызываете его, свойство Document еще не установлено полностью, и вы получаете исключение нулевой ссылки. Если вы дождетесь загрузки страницы, все будет в порядке.

ОБНОВЛЕНИЕ: Попробовал ваш пример, и ваш обработчик событий вызывается, однако я подозреваю, что он вызывается из другого потока. Таким образом, он попадает в строку, где выдается исключение, но вы его никогда не видите, потому что оно в другом потоке. Выньте строку, которая выдает исключение, и замените ее на:

webBrowser1.Document.Title = "foobar!";

Это должно сработать.

0 голосов
/ 26 ноября 2009

Я использую метод выше, который использует about: blank, и он работает нормально! Вчера я опубликовал статью об этом методе, и сегодня я только что нашел эту тему здесь :) Моя статья здесь: http://starikovs.com/2009/11/25/set-html-webbrowser-csharp/

0 голосов
/ 04 мая 2009

Загрузка документа происходит асинхронно, поэтому к тому времени, когда вы установите заголовок, нет никакой гарантии, что документ действительно загружен. Вам нужно обработать соответствующие события браузера, чтобы определить, когда навигация завершена, прежде чем пытаться изменить документ.

Обновление

Во всех ситуациях, когда я использовал браузер, мне пришлось сначала перейти на страницу about:blank, прежде чем я смог изменить документ. Возможно, вам следует попробовать это перед установкой DocumentText.

...