Question

J'essaie de charger un document HTML dans un contrôle WebBrowser, mais je suis à bout de ressources. Voici un exemple:

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

Le gestionnaire d'événements wb_c n'est jamais appelé non plus. Le contrôle Webbrowser est défini en tant que contrôle du formulaire. Le formulaire lui-même ne comprend que le navigateur et le bouton.

Quelqu'un a-t-il des idées? J'ai déjà utilisé cette classe auparavant sans problème, mais cette fois, les dieux .Net me refusent! Mon objectif final est d’imprimer le document rendu, mais pour l’instant je ne parviens même pas à le faire accepter mon code HTML. J'ai peut-être besoin d'eau bénite ou de quelque chose d'autre.

Modifier: si la ligne de titre est supprimée ci-dessus, le gestionnaire d'événements wb_c n'est jamais déclenché. C'est comme si quelque chose n'allait pas avec le composant COM lui-même, ou quelque chose comme ça.

Éditer 2: À la demande générale, voici un blob complet de mon code.

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

Il s'agit d'un projet .Net 2.0 exécuté dans VS 2005. System.Windows.Forms.dll est la v2.0.50727.

EDIT 3: Ajout de cette ligne à la fin du constructeur de Form2:

webBrowser1.Navigate("about:blank");

déclenche-t-il le gestionnaire d'événements, mais cela n'affecte pas le comportement du code lors de la définition du texte du document. La définition d'un point d'arrêt après la ligne webBrowser1.Document.Text donne toujours le même " \ 0 " chaîne, et essayer de définir le titre donne toujours un COM HERROR.

Était-ce utile?

La solution

Essayez de déplacer la ligne:

webBrowser1.Document.Title = "foobar!";

dans votre méthode wb_c. Je pense que le problème est que lorsque vous l'appelez, la propriété Document n'est pas encore complètement définie et vous obtenez une exception de référence nulle. Si vous attendez que la page soit chargée, tout devrait bien se passer.

UPDATE: Votre échantillon a été essayé et votre gestionnaire d'événements est appelé, mais je soupçonne qu'il a été appelé à partir d'un autre thread. Par conséquent, il arrive à la ligne où l'exception est levée, mais vous ne le voyez jamais réellement, car c'est dans un autre thread. Retirez la ligne qui lève l'exception et remplacez-la par:

<*>

Cela devrait faire l'affaire.

Autres conseils

Avant de pouvoir manipuler le document, vous devez exécuter la commande de navigation. Pour utiliser WebBrowser afin de construire une page HTML à partir de rien, accédez à "about: About", comme suit: comme suit:

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

Utilisez ensuite InnerHtml sur l'élément racine et non la propriété DocumentText pour appliquer le code HTML tel que vous êtes.

Le chargement du document est asynchrone. Par conséquent, lorsque vous définissez le titre, rien ne garantit que le document a été chargé. Vous devez gérer les événements de navigateur appropriés pour détecter la fin de la navigation avant de tenter de modifier le document.

Mettre à jour

Dans toutes les situations où j'ai utilisé le navigateur, je devais d'abord accéder à la page à propos de: vide avant de pouvoir modifier le document. Vous devriez peut-être essayer ceci avant de définir le DocumentText .

J'utilise la méthode ci-dessus qui utilise about: blank et ça fonctionne bien! J'ai publié un article sur cette méthode hier et aujourd'hui, je viens de trouver ce sujet ici :) Mon article ici: http://starikovs.com/2009/11 / 25 / set-html-webbrowser-csharp /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top