首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

【200分】求解决webBrowser调用html页面JS解决方法

2012-06-01 
【200分】求解决webBrowser调用html页面JS我想用webBrowser向本地的html页面传值,结果出现了奇怪的问题。代码

【200分】求解决webBrowser调用html页面JS
我想用webBrowser向本地的html页面传值,结果出现了奇怪的问题。

代码如下:

下面是本地的html页面

HTML code
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>    <title>显示</title>    <script src="jquery-1.5.2.min.js" type="text/javascript"></script>     <style type="text/css">       .BarNow       {           font-size:26px;           color:Blue;       }    </style>    <script language="javascript" type="text/javascript">       function ShowCode(source) {          $("#message").html(source);       }    </script></head>   <body>         <div id="message"></div>  </body></html>


用来订阅消息和发送信息的类

C# code
    //订阅者    public interface Subscriber    {         void ShowMsg(string Msg);    }    public static class Message     {        static IList<Subscriber> Subscribers = new List<Subscriber>();        public static void Add(Subscriber sub)        {            Subscribers.Add(sub);        }        public static void Delete(Subscriber sub)        {            Subscribers.Remove(sub);        }        public static void AssignMessage(string Msg)        {            foreach (var sub in Subscribers)            {                sub.ShowMsg(Msg);            }        }        //调用Send发送消息给订阅者        public static void Send(string message)        {            AssignMessage(message);        }    }


订阅消息的窗体
C# code
    [System.Runtime.InteropServices.ComVisibleAttribute(true)]    public partial class Child : Form ,Subscriber    {        public Child(string name)        {            InitializeComponent();            test();                }        private void test()        {            webBrowser1.Navigate(HtmlPath+"Page.html");            webBrowser1.ObjectForScripting = this;            Message.Add(this);//订阅消息        }        //显示消息给html        public void ShowMsg(string Msg)        {             //检查消息是否接收到,得到接收的消息为;这是测试消息!            Label1.Text = Msg;            object[] objects = new object[10];            objects[0] =  "<span class=\"BarNow\">" + Msg + "</span>";            webBrowser1.Document.InvokeScript("ShowCode", objects);            //通过订阅者的方式调用出现InvalidCastException异常。提示数字转换异常??            //通过button调用却是正常显示!!        }        private void Child_FormClosing(object sender, FormClosingEventArgs e)        {            Message.Delete(this);//取消订阅            Dispose();        }        //用窗体上button直接调用ShowMsg() 消息能正常显示消息        private void Button1_Click(object sender, EventArgs e)        {            //object[] objects = new object[1];            //objects[0] = "<span class=\"BarNow\">Adflsfjaslnlu</span>";            //webBrowser1.Document.InvokeScript("ShowCode", objects);            ShowMsg("这是测试消息!"); //直接用button调用成功。        }

父窗体的用打开所有子窗体,其中每个子窗体都是一个订阅者
C# code
               foreach (string child in childs)                {                    if (!string.IsNullOrEmpty(child))                    {                        Child childForm = new Child(child)                         {                             AccessibleName = child,                             Text = child,                             MdiParent = this ,                            ShowInTaskbar=false,                            ShowIcon=false                        };                        childForm.Show();                    }                } 



为什么,我用button直接调用就可以正常显示在html页面上,而通过订阅者模式却会出现异常呢?

[解决办法]
感觉可能是异步的问题
写在构造函数里的test()执行完成后.Html可能还没有加载完成.所以调用不成功
个人愚见
[解决办法]
如果是1楼说的原因,就注册窗体的 Shown 事件,在事件方法里调用 test() ,再注册 webBrowser1 的 DocumentCompleted 事件,在事件方法里执行 Message.Add(this);
[解决办法]
哪里调的Send?

热点排行