سؤال

أحاول تحميل مستند 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.

هل كانت مفيدة؟

المحلول

حاول تحريك الخط:

webBrowser1.Document.Title = "foobar!";

في طريقة wb_c الخاصة بك.أعتقد أن المشكلة تكمن في أنه عند الاتصال بها، لم يتم تعيين خاصية المستند بشكل كامل بعد، وستحصل على استثناء مرجعي فارغ.إذا انتظرت حتى يتم تحميل الصفحة، فيجب أن تكون على ما يرام.

تحديث: جربت العينة الخاصة بك، وتم استدعاء معالج الحدث الخاص بك، ولكن أظن أنه يتم استدعاؤه من سلسلة محادثات أخرى.لذلك، يصل إلى السطر الذي تم فيه طرح الاستثناء، لكنك لا تراه فعليًا أبدًا، لأنه موجود في موضوع آخر.احذف السطر الذي يطرح الاستثناء واستبدله بما يلي:

webBrowser1.Document.Title = "foobar!";

الذي عليه أن يقوم بالخدعة.

نصائح أخرى

وقبل أن تتمكن من التعامل مع الوثيقة تحتاج إلى تنفيذ الأمر التنقل. استخدام WebBrowser إلى بناء صفحة HTML من الصفر ما عليك سوى الانتقال إلى <م> "حول: فارغة" مثل ذلك:

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

وثم استخدم Html داخلي على العنصر الجذر وليس ملكا DocumentText لتطبيق الاكواد كما أنت.

وتحميل الوثيقة هو غير متزامن ذلك في الوقت الذي قمت بتعيين العنوان، ليس هناك ما يضمن أن الوثيقة تم تحميلها بالفعل. تحتاج إلى معالجة الأحداث متصفح المناسبة للكشف عند التنقل اكتمال قبل محاولة تغيير وثيقة.

تحديث

في جميع الحالات التي كنت تستخدم متصفح، لقد كان للانتقال إلى الصفحة about:blank أولا قبل أن أتمكن من تعديل الوثيقة. ربما عليك أن تحاول ذلك قبل وضع DocumentText.

وأنا استخدم الطريقة أعلاه التي يستخدمها حول: لم تحدد، وأنه يعمل يرام! نشرت مقالا حول هذا الأسلوب أمس واليوم لقد وجدت فقط هذا الموضوع هنا :) مقالتي هنا: http://starikovs.com/2009/11 / 25 / مجموعة-أتش تي أم أل webbrowser-CSHARP /

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top