C# "InvalidCastException"尝试从 TimerCallback 访问 webbrowser 控件时

标签 c# browser

基本上我和这个用户有同样的问题: How to check for TrackBar sliding with mouse hold and release 我使用提供的第一个解决方案解决了这个问题。但是,调用计时器时,我想在 Web 浏览器控件上调用 InvokeScript。 InvokeScript 运行没有错误,但 javascript 函数从未被调用。当我从按钮单击事件处理程序调用此脚本时,该函数被正确调用。

我发现当我尝试从 webbrowser 控件(如 MessageBox.Show(webBrowser1.DocumentText) 访问属性时,会抛出 InvalidCastException。

// in constructor:
webBrowser1.AllowWebBrowserDrop = false;
webBrowser1.IsWebBrowserContextMenuEnabled = false;
webBrowser1.WebBrowserShortcutsEnabled = false;
webBrowser1.ObjectForScripting = this;
timer = new System.Threading.Timer(this.TimerElapsed);     

private void trackBar2_ValueChanged(object sender, EventArgs e)
{
        timer.Change(500, -1);
}
private void TimerElapsed(object state)
{
    this.webBrowser1.InvokeScript("jmp_end");
    MessageBox.Show(this.webBrowser1.DocumentText);
    timerRunning = false;
}
private void TimerElapsed(object state)
{
    WebBrowser brw = getBrowser();
    brw.Document.InvokeScript("jmpend");
    MessageBox.Show(brw.DocumentText);
    timerRunning = false;
}

有谁知道我在这里做错了什么?还是有其他方法可以获得相同的结果?

在对 InvokeRequired 发表评论后,这听起来完全符合我的需要。但我无法让它工作。这是我从 C# System.InvalidCastException 的示例代码中得到的。

public delegate WebBrowser getBrowserHandler();
public WebBrowser getBrowser()
{
    if (InvokeRequired)
    {
        return Invoke(new getBrowserHandler(getBrowser)) as WebBrowser;
    }
    else
    {
        return webBrowser1;
    }
}

private void TimerElapsed(object state)
{
    WebBrowser brw = getBrowser();
    brw.Document.InvokeScript("jmpend");
    MessageBox.Show(brw.DocumentText);
    timerRunning = false;
}

我在这里错过了什么?

最佳答案

调用者(计时器)与创建控件的线程不同。

参见 Control.InvokeRequired Property

应解决您的问题的示例代码发布在这个问题上:C# System.InvalidCastException

关于C# "InvalidCastException"尝试从 TimerCallback 访问 webbrowser 控件时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9048922/

相关文章:

c# - asp.net 中第三层(数据访问层)的 Db Manager 类

c# - 在保持 Web.Config 安全的同时从 WebMethod 获取错误消息

c# - 如何将 javascript 添加到 WebBrowser.NavigateToString()?

events - 处理 WebBrowser 控件上的按键事件

c# - 从Mysql中检索字段到gridview

c# - 如何将linq选择器转换为预测器

c# - 将 'Xamarin.Forms' 添加到...未将对象引用设置为对象的实例。添加 nuget 包时出现错误

c# - 如何使用 WebBrowser 获取新窗口的 URL

javascript - 进行浏览器测试时 Windows 版本重要吗?

Emacs - 网络浏览器中的 help() 输出