문제

HTML 문서를 Webbrowser 컨트롤에로드하려고하지만 Wits End에 있습니다. 다음은 샘플입니다.

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 이벤트 핸들러도 호출되지 않습니다. Webbrowser 컨트롤은 양식의 컨트롤로 정의됩니다. 양식 자체는 브라우저와 버튼 만 구성됩니다.

아무도 아이디어가 있습니까? 나는 문제 없이이 수업을 사용했지만 이번에는 .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;
}

이것은 vs 2005에서 실행되는 .NET 2.0 프로젝트입니다. System.Windows.forms.dll은 v2.0.50727입니다.

편집 3 : Form2 생성자의 끝에이 라인을 추가하십시오.

webBrowser1.Navigate("about:blank");

하다 이벤트 핸들러를 트리거하지만 문서 텍스트를 설정할 때 코드의 동작에 영향을 미치지 않습니다. WebBrowser1.document.text line 이후에 중단 점을 설정하면 여전히 동일한 " 0"문자열이 제공되며 제목을 설정하려고 시도하면 여전히 Com Herror가 제공됩니다.

도움이 되었습니까?

해결책

라인을 이동 해보세요 :

webBrowser1.Document.Title = "foobar!";

WB_C 방법으로. 문제는 당신이 그것을 호출 할 때, 문서 속성이 아직 완성되지 않았으며, 당신은 null 참조 예외를 얻고 있다는 것입니다. 페이지가로드 될 때까지 기다리면 괜찮을 것입니다.

업데이트: 샘플을 시험해 보면 이벤트 핸들러가 호출되지만 다른 스레드에서 호출되는 것으로 생각됩니다. 따라서 예외가 발생하는 줄에 도달하지만, 다른 스레드에 있기 때문에 실제로는 볼 수 없습니다. 예외를 던지는 줄을 꺼내 다음으로 바꾸십시오.

webBrowser1.Document.Title = "foobar!";

그것은 트릭을 수행해야합니다.

다른 팁

문서를 조작하기 전에 Navigate 명령을 실행해야합니다. WebBrowser를 사용하여 HTML 페이지를 처음부터 구성하십시오. "정보 : 공백" 그렇게 :

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

그런 다음 html을 그대로 적용하려면 DocumentText 속성이 아닌 루트 요소의 innerHTML을 사용하십시오.

문서 로딩은 비동기식이므로 제목을 설정할 때 문서가 실제로로드되었음을 보장 할 수 없습니다. 문서를 변경하기 전에 내비게이션이 완료된시기를 감지하려면 적절한 브라우저 이벤트를 처리해야합니다.

업데이트

브라우저를 사용한 모든 상황에서 about:blank 문서를 수정하기 전에 먼저 페이지입니다. 아마도 당신은 설정하기 전에 이것을 시도해야 할 것입니다 DocumentText.

나는 다음을 사용하는 위의 방법을 사용합니다 : blank 그리고 그것은 작동합니다! 어제이 방법에 관한 기사를 게시했고 오늘이 주제를 여기에서 찾았습니다 :) 내 기사는 여기에 있습니다. http://starikovs.com/2009/11/25/set-html-webbrowser-csharp/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top