WebBrowser控件和ID的GetElement

时间:2012-03-02 04:20:48

标签: c# winforms browser getelementbyid

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

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

我想让WinForm上的按钮将标题的样式从“display:none”切换为“display:block; text-align:middle”。 这就是我在做的事情:

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}

请注意,我可以使用btnAnswer_Click方法控制Style属性,但不能使用frmView_Load方法控制。我知道我可以在创建它时将样式信息放入div标签(这确实有效),但为什么上面的代码不起作用?

更新:
我找到了可能正朝着正确方向发展的事情。如果我在webBrowser1.Update() frmView_Load中的所有内容之后的任何时候调用webBrowser1.Navigate("about:blank")。不幸的是,在frmView_Load退出后更改文档的任何尝试都将失败。它们不仅会失败,而且在frmView_Load返回后,webBrowser1.Document将以某种方式设置为NULL。 任何人都可以了解这种控制应该如何运作?

3 个答案:

答案 0 :(得分:2)

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

基本上,我对文档的“写入”并不是因为“write”函数返回。我必须阻止控制线程,直到文档反映这些更改,如果我想引用该写入的内容。 MS建议使用睡眠循环。这是我的写作&amp;块功能看起来像:

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;
    }
}

感谢大家的回复。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我不是很熟悉这些东西,但我认为你需要打电话

webBrowser1.Refresh();

在frmView_Load

的最后