WebBrowser 控件和通过 ID 获取元素

2024-03-01

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

具体来说,我想使用 WebBrowser.Document.GetObjectByID("myid").Style 来设置作为加载到 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 标签中(这确实有效),但为什么上面的代码不起作用?

Update:
我发现一些事情可能正在朝着正确的方向发展。如果我打电话webBrowser1.Update()之后的任何时候webBrowser1.Navigate("about:blank")frmView_Load 中的所有内容都有效。不幸的是,在 frmView_Load 退出后任何更改文档的尝试都将失败。它们不仅会失败,而且在 frmView_Load 返回后,webBrowser1.Document 将以某种方式设置为 NULL。 谁能解释一下这个控件应该如何工作?


在查看了有关 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;
    }
}

感谢大家的回复。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebBrowser 控件和通过 ID 获取元素 的相关文章

  • C# 返回一个数的倍数和余数?

    我想找到给定数字的 3 的所有倍数 并找到余数 例如 给定数字 10 3 的倍数 3 6 9 余数 1 给定数字 11 3 的倍数 3 6 9 余数 2 到目前为止我的算法 但不是代码 是这样的 检查 X 是否是 3 的倍数 是 返回倍数
  • 为什么不继承 std::allocator

    我创建了自己的分配器 如下所示 template
  • 忽略 Entity Framework 6 中除部分属性外的所有属性

    我想使用实体框架在数据库中保留一些数据 我有一些更大的 POCO 但我只想存储一些属性 我知道我可以通过Fluent API通过使用Ignore 方法 但是是否也有可能不仅忽略已定义的属性 而且还忽略除已定义属性之外的所有属性 所以如果你有
  • 不能从模板 C++ 类继承[重复]

    这个问题在这里已经有答案了 我不知道这里出了什么问题 也许有人可以帮助我 我想继承我的新班级MyDictionary来自模板抽象类dictionary 我有这样的代码 字典 h ifndef UNTITLED CPP DICTIONARY
  • 组合 lambda 表达式以检索嵌套值

    我正在尝试创建表达式来访问嵌套结构中的字段或属性 我设法为平面对象上的字段和属性创建 getter 和 setter 作为 lambda 表达式 它的工作原理如下 Delegate getter getGetterExpression ob
  • 从字符串末尾删除多个字符类型

    我有一个构建地址字段的循环 其中一些字段在字符串末尾可能为空 List
  • 未解决的包含:。为什么?

    在运行一个简单的 c 程序时 我收到一个 Unresolved inclusion
  • 使用 libavcodec 提取音频样本

    我对如何从 AVFrame 中的数据提取双值感到困惑 我正在尝试提取帧 我尝试检查用 CPython 编写的 av 模块背后的源代码 尤其是 AudioFrame 来尝试了解它从何处解码样本 https github com PyAV Or
  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 设置 cookie 时中断 JavaScript 执行

    当设置 cookie 时 是否可以始终中断浏览器开发人员工具中的 javascript 执行 无需显式设置 JS 断点 document cookie 在 html head 块的开头添加此代码片段效果很好
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了

随机推荐

  • 幂集生成函数的时间复杂度

    我试图计算出我编写的函数的时间复杂度 它生成一个电源组 http en wikipedia org wiki Power set对于给定的字符串 public static HashSet
  • 高效浮点比较 (Cortex-A8)

    有一个很大的 100 000 数组floating点变量 并且有一个阈值 也floating point 问题是我必须将数组中的每个变量与阈值进行比较 但 NEON 标志传输需要非常长的时间 根据探查器 约为 20 个周期 有没有有效的方法
  • 使用 nginx 通过 index.php 路由请求 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在将我的服务器从 Apache 迁移到 Nginx 这非常简单 htaccess rule RewriteEngine On RewriteCon
  • 在 ssl (ldaps) 的支持下连接活动目录

    我正在尝试在 ssl 的支持下连接活动目录 我尝试了以下网站中的步骤 http confluence atlassian com display CROWD Configuring an SSL Certificate for Micros
  • 防止进入后台状态 ios swift 时 websocket 连接断开

    经过大量研究后 这似乎是一个灰色地带 一旦用户进入后台状态 使用 Swift 库 Starscream 但我相信问题出在 iOS 和套接字上 我会尝试通过 websockets 偶尔发送网络请求 用户离开应用程序后不久 套接字连接会自动断开
  • 如何获取全日历的开始和结束时间?

    我怎样才能得到start and end全日历中可见天数的时间 我需要它在另一个 javascript 实例中使用 有没有类似的功能 calender getStartTime 如果您正在寻找visible开始和结束日期 那就是visSta
  • 有 Safari 阅读器的 API 吗?

    Safari Reader 是否有一个 API 可用于为 iOS 应用过滤网页中的文本 清除广告 不需要的文本部分等 如果没有 还有其他选择吗 只是在为我的应用程序做一些研究 这就是我发现的 无法发布所有链接 因为我是新人 但很容易通过谷歌
  • 是否有理由使用 std::conjunction/std::disjunction 而不是“&&”/“||”上的折叠表达式?

    是否存在您无法正确处理的特定情况std conjunction std disjunction并且不使用更 基本 即语言功能而不是库功能 的折叠表达式 Example func is enabled if all Ts have the s
  • ngx-datatables 在排序时给出“rxjs_1.fromEvent 不是函数”错误

    我只是按照演示来展示一个简单的数据表 这是我的代码 columns name ID prop id name Street Address prop address street name Suburb prop address subur
  • Java流过滤器值之和

    我有一堂课叫MonitoredData其中描述了一项活动及其开始时间和结束时间 属性是activityLabel startTime endTime 我必须使用流对这些活动进行分组和过滤 这些活动的总持续时间超过 10 小时 我设法计算持续
  • 如何访问 Apple 照片应用程序中使用的人物相册

    苹果的照片应用程序具有面部识别功能 我想知道是否存在 API 来访问已由应用程序分类的照片的相关数据 Apple 发布了一个用于访问 Apple Photos 的 SDK 名为照片套件 https developer apple com d
  • Django REST Framework 中的命名 JSON 数组

    实际上我已经定义了模型序列化器 class MyObjectSerializer serializers ModelSerializer class Meta model MyObject fields id name 它为我准备 JSON
  • CasperJS“无法加载脚本”

    我在为我一直使用的 casperJS 编写新脚本时遇到了最奇怪的问题 当我尝试使用 casperjs myScript js 启动脚本时 我得到以下信息 Unable to load script var www scrapers mySc
  • 操作 TCP 标头中 ISN 编号的最有效方法 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我目前正在尝试编写一个程序 该程序将
  • iPhone:NSFilemanager fileExistsAtPath:isDirectory:无法正常工作?

    我正在为越狱 iPhone 开发一款应用程序 我试图仅获取文件夹的目录 所以我正在这样做 NSArray contentOfFolder NSFileManager defaultManager directoryContentsAtPat
  • 在具有中心选择水平滚动视图的 RecyclerView 上无法使用 Notifydatasetchange?

    自动滚动是个问题 而且使用代码移动到某个特定位置也很困难 我正在通过水平滚动和中心选择使两个 recyclerView 相互依赖 所以我的问题是使用 Notifydatasetchanged 方法并将 recyclerView 位置重置为
  • 检测 DOM 对象与 jQuery 对象

    我有一个函数 我希望能够允许传入常规 javascript DOM 元素对象或 jQuery 对象 如果它还不是 jQuery 对象 我将使其成为一个 有谁知道一种非常可靠的方法来检测这一点 function functionName el
  • 如何参数化 Eclipse 生成的 make 文件

    我有一个配置为生成 make 文件的 Eclipse CDT 项目 我目前正在 Windows 上进行开发 我的构建服务器正在运行 Linux make 文件在我的本地计算机上构建得很好 但我有两个预构建的外部依赖项 boost 和 Zer
  • UITableView ,重新加载时滚动到底部?

    我有一个UITableView with cells是动态更新的 一切正常 除了什么时候tableview reload被调用 见下文 来刷新cells在表格中 我希望表格滚动到底部以显示新条目 void reloadTable NSNot
  • WebBrowser 控件和通过 ID 获取元素

    我正在使用 Visual C Winforms 来控制 WebBrowser 对象 具体来说 我想使用 WebBrowser Document GetObjectByID myid Style 来设置作为加载到 WebBrowser 对象中