基本上我有这个用户相同的问题: How to check for TrackBar sliding with mouse hold and release 我使用提供的第一个解决方案解决了这个问题。但是,当定时器被调用时,我想在Web浏览器控件上调用InvokeScript。 InvokeScript运行时没有错误,但JavaScript函数从不被调用。当我从像点击按钮的事件处理程序调用此脚本时,函数被正确调用。C#“InvalidCastException”当试图从TimerCallback访问webbrowser控制
我发现,当我尝试访问属性从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;
}
我在这里错过了什么?
请张贴您的代码。 – ChrisF 2012-01-28 21:46:07
请参阅:http://stackoverflow.com/questions/5268281/c-sharp-system-invalidcastexception – 2012-01-28 22:06:24
使用System.Windows.Forms.Timer来避免挑战IE以线程安全的方式提供属性。 – 2012-01-28 22:31:39