WebBrowser는 문서를로드하지 않습니다
-
03-07-2019 - |
문제
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/