C# WebBrowser.Document.Body始终为空
我将C# WebBrowser.Document.Body始终为空,c#,.net,winforms,webbrowser-control,C#,.net,Winforms,Webbrowser Control,我将WebBrowser文档设置为编辑模式。我试图通过使用WebBrowser.Document.body.InnerText来操纵body元素的内部文本,但是,WebBrowser.Document.body保持为空 以下是我创建文档内容的代码: private WebBrowser HtmlEditor = new WebBrowser(); public HtmlEditControl() { InitializeComponent(); HtmlEditor.Docume
WebBrowser
文档设置为编辑模式。我试图通过使用WebBrowser.Document.body.InnerText
来操纵body元素的内部文本,但是,WebBrowser.Document.body
保持为空
以下是我创建文档内容的代码:
private WebBrowser HtmlEditor = new WebBrowser();
public HtmlEditControl()
{
InitializeComponent();
HtmlEditor.DocumentText = "<html><body></body></html>";
myDoc = (IHTMLDocument2)HtmlEditor.Document.DomDocument;
myDoc.designMode = "On";
HtmlEditor.Refresh(WebBrowserRefreshOption.Completely);
myContentsChanged = false;
}
private WebBrowser HtmlEditor=new WebBrowser();
公共HtmlEditControl()
{
初始化组件();
HtmlEditor.DocumentText=“”;
myDoc=(IHTMLDocument2)HtmlEditor.Document.DomDocument;
myDoc.designMode=“On”;
HtmlEditor.Refresh(WebBrowserRefreshOption.complete);
myContentsChanged=false;
}
我可以很好地编辑代码和所有内容,但我不明白为什么HtmlEditor.Document.Body
保持为空。我知道,每当我需要将文本加载到表单中时,我总是可以重置文档体,但我更愿意理解为什么会这样,如果没有其他知识的话
非常感谢您提供的任何帮助。您必须等待Web浏览器的
DocumentCompleted
事件触发,以便DomDocument.Body
不为空。我只是测试这个来验证。我想问题仍然存在:当文档尚未完全加载时,如何通过底层COM接口进行编辑
我检查了DocumentCompleted和构造函数中的IHTMLDocument2
指针是否相同。它们是,这可能表明底层COM对象重用单个HTML文档对象。看起来,您在构造函数中所做的任何更改都有很好的机会被覆盖或引发异常
例如,如果在构造函数中执行此操作,则会出现错误:
IHTMLDocument2 p1 = (IHTMLDocument2) HTMLEditor.Document.DomDocument;
p1.title = "Hello world!";
如果我在DocumentCompleted处理程序中执行相同的操作,它就可以正常工作
希望这有帮助。谢谢。首先使用事件,它发生在WebBrowser控件完成加载文档时:
public HtmlEditControl()
{
InitializeComponent();
HtmlEditor.DocumentText = "<html><body></body></html>";
HtmlEditor.DocumentCompleted += HtmlEditorDocumentCompleted;
}
void HtmlEditorDocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
myDoc = (IHTMLDocument2)((WebBrowser)sender).Document.DomDocument;
myDoc.designMode = "On";
HtmlEditor.Refresh(WebBrowserRefreshOption.Completely);
myContentsChanged = false;
}
public HtmlEditControl()
{
初始化组件();
HtmlEditor.DocumentText=“”;
HtmlEditor.DocumentCompleted+=HtmlEditor DocumentCompleted;
}
无效HtmlEditorDocumentCompleted(对象发送方,
WebBrowserDocumentCompletedEventArgs(e)
{
myDoc=(IHTMLDocument2)((WebBrowser)发送方).Document.DomDocument;
myDoc.designMode=“On”;
HtmlEditor.Refresh(WebBrowserRefreshOption.complete);
myContentsChanged=false;
}
或者简单的方法:
public HtmlEditControl()
{
InitializeComponent();
HtmlEditor.DocumentText = "<html><body></body></html>";
HtmlEditor.DocumentCompleted += (sender, e) =>
{
myDoc = (IHTMLDocument2) HtmlEditor.Document.DomDocument;
myDoc.designMode = "On";
HtmlEditor.Refresh(WebBrowserRefreshOption.Completely);
myContentsChanged = false;
};
}
public HtmlEditControl()
{
初始化组件();
HtmlEditor.DocumentText=“”;
HtmlEditor.DocumentCompleted+=(发件人,e)=>
{
myDoc=(IHTMLDocument2)HtmlEditor.Document.DomDocument;
myDoc.designMode=“On”;
HtmlEditor.Refresh(WebBrowserRefreshOption.complete);
myContentsChanged=false;
};
}
您需要让WebBrowser
控件单独工作一点,以便给它一些时间来设置Document.Body
属性
我通过调用Application.DoEvents()来实现这一点代码>
例如,在您的代码中:
private WebBrowser HtmlEditor = new WebBrowser();
public HtmlEditControl()
{
InitializeComponent();
HtmlEditor.DocumentText = "<html><body></body></html>";
// Let's leave the WebBrowser control working alone.
while (HtmlEditor.Document.Body == null)
{
Application.DoEvents();
}
myDoc = (IHTMLDocument2)HtmlEditor.Document.DomDocument;
myDoc.designMode = "On";
HtmlEditor.Refresh(WebBrowserRefreshOption.Completely);
myContentsChanged = false;
}
private WebBrowser HtmlEditor=new WebBrowser();
公共HtmlEditControl()
{
初始化组件();
HtmlEditor.DocumentText=“”;
//让我们让WebBrowser控件单独工作。
while(HtmlEditor.Document.Body==null)
{
Application.DoEvents();
}
myDoc=(IHTMLDocument2)HtmlEditor.Document.DomDocument;
myDoc.designMode=“On”;
HtmlEditor.Refresh(WebBrowserRefreshOption.complete);
myContentsChanged=false;
}
if(HtmlEditor.Document.Body==null)
{
HtmlEditor.Document.OpenNew(false).Write(@“”);
}
HtmlEditor.Document.Body.SetAttribute(“contentEditable”、“true”);
请看一下这个链接好吗?不,我读了那篇文章后在这里发了帖子。看一下@Jeff:谢谢你的文章,但文档正文仍然为空:\
if (HtmlEditor.Document.Body == null)
{
HtmlEditor.Document.OpenNew(false).Write(@"<html><body><div id=""editable""></div></body></html>");
}
HtmlEditor.Document.Body.SetAttribute("contentEditable", "true");