Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebBrowser.Document.Body始终为空_C#_.net_Winforms_Webbrowser Control - Fatal编程技术网

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");