C# 委托多窗体操作传值问题

abchao8 2014-06-13 08:33:31
MID多窗体(使用了using WeifenLuo.WinFormsUI.Docking多窗口界面)主要文件环境具体如下:
主窗体:mainForm;子窗体:cShow

现在是通过mainForm打开cShow,cShow里加载了webBrowser1。
通过 private void button1_Click(object sender, EventArgs e)这个是能正常进行与主窗体mainForm的交互的。
通过 public void cCall_js(string sms){//执行代码}却没有任何反应。

因cShow的webBrowser1要与脚本交换,在cShow里建了一个用于与JS的类
cShow具体的代码如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
using System.Security.Permissions;
using System.Runtime.InteropServices;

namespace htmlcode
{
//通过这里的委托进行与父窗体的交互
public delegate void DelegateChangeTextVal(string TextVal);
public partial class web_Browse : WeifenLuo.WinFormsUI.Docking.DockContent
{
/// <summary>
/// 委托
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void MyDelegate(object sender, MyEventArgs e);
public event MyDelegate MyEvent;

// 2.定义委托事件
public event DelegateChangeTextVal ChangeTextVal;
//此类必须对 COM 可见,才能从Javascript中调用。
[ComVisible(true)]
public class sCall
{
public sCall()
{
}
public void cCall_js(string sms)
{
//这里想像能button1_Click事件一样操作到父窗休.但这里不管怎么操作都无反应,也没有错误。
}
}

public web_Browse()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
webBrowser1.ScriptErrorsSuppressed = true; //禁用错误脚本提示
webBrowser1.IsWebBrowserContextMenuEnabled = false; //禁用右键菜单
webBrowser1.WebBrowserShortcutsEnabled = false; //禁用快捷键
webBrowser1.AllowWebBrowserDrop = false;//禁止拖拽
webBrowser1.ScrollBarsEnabled = false;//禁止滚动条
webBrowser1.Navigate(Application.StartupPath + "\\html\\index.html");
webBrowser1.ObjectForScripting = new sCall();

}

private void button1_Click(object sender, EventArgs e)
{
ChangeMainFormText("成功");//这里能成功更新主窗体
//
}

public void ChangeMainFormText(string TextVal)
{
ChangeTextVal(TextVal);
}

}
}
}


...全文
421 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
abchao8 2014-06-13
  • 打赏
  • 举报
回复
帮个忙啊兄弟姐妹们
abchao8 2014-06-13
  • 打赏
  • 举报
回复
引用 8 楼 bwangel 的回复:
窗体要与js交互,除了定义ObjectFormScripting以外,还要在窗体类上面声明[ComVisible] 并且还要在js中用 window.external来获取这个窗体。这些都做了吗?

public class sCall         {            
 public sCall()             {           
  }             
public void cCall_js(string sms)        
     {                  
         Message.Show(sms);    //这里能显示值的,  
   }       
  } 

都做了.
bwangel 2014-06-13
  • 打赏
  • 举报
回复
窗体要与js交互,除了定义ObjectFormScripting以外,还要在窗体类上面声明[ComVisible] 并且还要在js中用 window.external来获取这个窗体。这些都做了吗?
abchao8 2014-06-13
  • 打赏
  • 举报
回复
引用 6 楼 changjiangzhibin 的回复:
是COM组件,先看组件有没有加载
public class sCall         {             public sCall()             {             }             public void cCall_js(string sms)             {                     Message.Show("ok");//这样是成功的.             }         } 
changjiangzhibin 2014-06-13
  • 打赏
  • 举报
回复
是COM组件,先看组件有没有加载
abchao8 2014-06-13
  • 打赏
  • 举报
回复
引用 2 楼 bdmh 的回复:
第一,没看到哪里调用sCall中的方法 第二,要想在sCall中操作窗体,你需要在创建sCall实例时,将窗体实例传给类实例,或者通过委托去控制
因为sCall的cCall_js(string sms) 是直接通过JS触发的.这里没办法进行窗体实例. 能不能请教一下怎么委托处理?
abchao8 2014-06-13
  • 打赏
  • 举报
回复
两位:是通过这句 webBrowser1.ObjectForScripting = new sCall(); 进行触发的.
abchao8 2014-06-13
  • 打赏
  • 举报
回复
webBrowser1.ObjectForScripting = new sCall();
bdmh 2014-06-13
  • 打赏
  • 举报
回复
第一,没看到哪里调用sCall中的方法 第二,要想在sCall中操作窗体,你需要在创建sCall实例时,将窗体实例传给类实例,或者通过委托去控制
  • 打赏
  • 举报
回复
大哥,你看清楚。你调用过 cCall_js(string sms) 推荐个学习网站 有空可以去看下 对你绝对有帮助 http://www.51zxw.net/study.asp?vip=8963801

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧