C# WebBrowser控件和GetElement(按ID)

C# WebBrowser控件和GetElement(按ID),c#,winforms,browser,getelementbyid,C#,Winforms,Browser,Getelementbyid,我正在使用Visual C#Winforms控制WebBrowser对象 具体来说,我想使用WebBrowser.Document.GetObjectByID(“myid”).Style来设置作为加载到WebBrowser对象中的文档的一部分的对象的样式 我想让WinForm上的按钮将标题的样式从“显示:无”切换到“显示:块;文本对齐:中间”。 这就是我正在做的: private void frmView_Load(object sender, EventArgs e) { string que

我正在使用Visual C#Winforms控制WebBrowser对象

具体来说,我想使用WebBrowser.Document.GetObjectByID(“myid”).Style来设置作为加载到WebBrowser对象中的文档的一部分的对象的样式

我想让WinForm上的按钮将标题的样式从“显示:无”切换到“显示:块;文本对齐:中间”。 这就是我正在做的:

private void frmView_Load(object sender, EventArgs e)
{
string question = "How many cows?";
string answer = "5 cows";
webBrowser1.Navigate("about:blank");
webBrowser1.Document.OpenNew(false);
webBrowser1.Document.Write("<html><body><div id='question'><h1>");
webBrowser1.Document.Write(question);
webBrowser1.Document.Write("</h1></div><div id='answer'><h2>");
webBrowser1.Document.Write(answer);
webBrowser1.Document.Write("</h2></div></body></html>");
webBrowser1.Refresh();
webBrowser1.Document.GetElementById("answer").Style = "display:none;";
//if I do a breakpoint here, I get the Style = "DISPLAY:NONE"
btnAnswer.Visible = true;
btnNext.Visible = true;
}

private void btnAnswer_Click(object sender, EventArgs e)
{
//if this is the first time ran, doing a breakpoint here will
//show Style to be NULL
webBrowser1.Document.GetElementById("answer").Style = "display:block;text-align:center";
//now the Style is properly set, and will remain that way, even after this function returns}
private void frmView\u加载(对象发送方,事件参数e)
{
字符串问题=“有多少头牛?”;
字符串answer=“5头牛”;
webBrowser1.导航(“关于:空白”);
webBrowser1.Document.OpenNew(false);
webBrowser1.Document.Write(“”);
webBrowser1.文件.写作(问题);
webBrowser1.Document.Write(“”);
webBrowser1.文件。书写(回答);
webBrowser1.Document.Write(“”);
webBrowser1.Refresh();
webBrowser1.Document.GetElementById(“答案”).Style=“display:none;”;
//如果在这里执行断点,则会得到Style=“DISPLAY:NONE”
btnAnswer.Visible=true;
btnNext.Visible=true;
}
私有无效Btnaswer_单击(对象发送者,事件参数e)
{
//如果这是第一次运行,则在此处执行断点将
//将样式显示为空
webBrowser1.Document.GetElementById(“答案”).Style=“显示:块;文本对齐:中心”;
//现在样式已正确设置,并且将保持这种方式,即使在该函数返回}
请注意,我可以使用btnAnswer_Click方法控制Style属性,但不能使用frmView_Load方法。我知道我可以在创建样式信息时将其放入div标记中(这确实有效),但是为什么上面的代码不起作用呢

更新:
我发现了一些可能朝着正确方向发展的东西。如果我在
webBrowser1.Navigate(“about:blank”)
之后的任意点调用
webBrowser1.Update()
,frmView\u Load中的所有内容都会工作。不幸的是,在frmView_加载退出后更改文档的任何尝试都将失败。它们不仅会失败,而且在frmView_Load返回webBrowser1后,文档将以某种方式设置为NULL。
有人能解释一下这个控件应该如何工作吗?

为什么不使用
显示:无
样式将隐藏文本放入
?当您需要显示它时,您只需要更新样式。您还可以将此样式应用于示例代码中包含您的答案的
h2
元素。

我对这些东西并不太熟悉,但我认为您需要调用

webBrowser1.Refresh();

在frmView_Load的最后,在查看了WebBrowser控件上的MS文档后,我意识到浏览器所做的一切都是异步的。话虽如此,这意味着我必须在设置属性后阻止我的控制线程,以确保这些属性已被设置

基本上,我对文档的“写入”并不是因为“写入”函数返回而完成的。如果我想引用写的内容,我必须阻止控制线程,直到文档反映这些更改。MS建议使用睡眠循环。下面是我的写块函数的样子:

private void ChangeDocument(string documentText, double timeout)
{
    DateTime startTime = DateTime.Now;
    double elapsed = 0;

    if (webBrowser1.Document == null)
    {
        webBrowser1.Navigate("about:blank");
    }

    webBrowser1.Document.OpenNew(false);

    while ((webBrowser1.DocumentText != "") && (elapsed < timeout))
    {
        Thread.Sleep(50);
        elapsed = DateTime.Now.Subtract(startTime).TotalMilliseconds;
    }

    webBrowser1.Document.Write(documentText);

    startTime = DateTime.Now;
    elapsed = 0;

    while ((webBrowser1.DocumentText != documentText) && (elapsed < timeout))
    {
        System.Threading.Thread.Sleep(50);
        elapsed = DateTime.Now.Subtract(startTime).TotalMilliseconds;
    }
}
private void ChangeDocument(字符串documentText,双超时)
{
DateTime startTime=DateTime.Now;
双时间=0;
if(webBrowser1.Document==null)
{
webBrowser1.导航(“关于:空白”);
}
webBrowser1.Document.OpenNew(false);
而((webBrowser1.DocumentText!=“”)和(&(已用时间<超时))
{
睡眠(50);
已用时间=DateTime.Now.Subtract(startTime).total毫秒;
}
webBrowser1.Document.Write(documentText);
startTime=DateTime.Now;
经过=0;
while((webBrowser1.DocumentText!=DocumentText)&&(经过<超时))
{
系统.线程.线程.睡眠(50);
已用时间=DateTime.Now.Subtract(startTime).total毫秒;
}
}

谢谢大家的回复。

您使用的是哪个
WebBrowser
控件?Windows窗体?WPF?System.Windows.Forms.webbrowser您的问题有点复杂,我尝试了代码并单击表单上的按钮(不是吗?)将答案更改为白色或黑色。另一个与我不同的地方是“在我退出该函数后,.Style属性为null”,样式是为我设置的。你可以编辑你的问题,让FormLoad事件设置初始HTML,并让button\u click事件更改颜色,这样每个人都可以轻松地重新编写。我已经更新了我的问题以显示更多内容。意外的行为是,我可以在表单加载中设置样式,但在表单加载退出后,该样式会以某种方式被删除。如果我按Btnaswer,它会将样式显示为“NULL”,但在之后(即使在它返回或重新调用之后),它会显示正确设置的样式。@JeremyThompson如果我使用按钮修改样式,它会工作。但是,正如您在我发布的新代码中看到的,无论出于何种原因,FormLoad方法都不会永久设置样式。我认为在初始化页面之后,有一种“finalize”命令我不会发送,它会在初始化函数之后自动发生。这有意义吗?我试过你的建议,但效果和我现在做的一样。我最初是将样式应用于H2元素,但现在我使用DIV。我想我可能缺少某种事件触发器。如果我再做一个按钮只设置样式,它就可以工作了。但是,如果我使用相同的函数来创建HTML和修改样式,它将不会这样做。此外,btnAnswer_Click方法不调用刷新,并且它能够更新样式而不会出现问题。