BrowserEventHandler onFocusInHandler;
        BrowserEventHandler onFocusOutHandler;
        BrowserEventHandler onclickHandler;
        private void axWebBrowser1_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
        {
            if (axWebBrowser1.ReadyState == SHDocVw.tagREADYSTATE.READYSTATE_COMPLETE)
            {
                //获取内嵌框架
                mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)axWebBrowser1.Document;
                mshtml.IHTMLElementCollection fm = ((mshtml.IHTMLDocument3)doc).getElementsByTagName("iframe");
                mshtml.IHTMLWindow2 frm = (mshtml.IHTMLWindow2)doc.parentWindow;
                mshtml.FramesCollection frms = frm.frames;
                int frmcount = frms.length;
                mshtml.IHTMLWindow2 frm8000 = null;
                mshtml.IHTMLWindow2 frm8032 = null;
                mshtml.IHTMLWindow2 ifram = null;
                object x;
                int i = 0;
                foreach (object obj in fm)
                {
                    x = i;
                    i++;
                    mshtml.DispHTMLFrameElement fm2 = obj as mshtml.DispHTMLFrameElement;
                    if (fm2.id == "iframe8032") { frm8032 = (mshtml.IHTMLWindow2)frms.item(ref x); }
                    if (fm2.id == "iframe8000") { frm8000 = (mshtml.IHTMLWindow2)frms.item(ref x); }
                    if (fm2.id == "ifram") { ifram = (mshtml.IHTMLWindow2)frms.item(ref x); }
                }
                if (frm8000 != null) { ifrm8000(frm8000); }
                if (frm8032 != null) { ifrm8032(frm8032); }
                if (ifram != null) { ifrm8000(ifram); }
            }        }void ifrm8000(mshtml.IHTMLWindow2 frm)
        {
            mshtml.IHTMLDocument2 idc = frm.document;
            mshtml.IHTMLElementCollection hec = ((mshtml.IHTMLDocument3)idc).getElementsByTagName("input");
            mshtml.DispHTMLInputElement photo = null;
            foreach (object obj in hec)
            {
                photo = obj as mshtml.DispHTMLInputElement;
                if (photo.id == "tel")
                {
                    onFocusOutHandler = new BrowserEventHandler();
                    onFocusOutHandler.Fire = new ElementEventFire(GetPhoneNo_8000);
                    //这里想给 GetPhoneNo_8000() 方式传入一些参数,比如一个object类型的参数,该怎么设置。
                    photo.onfocusout = onFocusOutHandler; 
                }
            }
        }
void GetPhoneNo_8000()
        {
            
            //这里想得到一些由调用函数传入参数。
 
        }
  [ComVisible(true)]
    public sealed class BrowserEventHandler
    {
        private ElementEventFire fire;
        public ElementEventFire Fire
        {
            set { this.fire = value; }
        }        [DispId(0)]
        public bool Handler()
        {
            this.fire();
            return true;
        }
    }    public delegate void ElementEventFire();由于页面里很多iframe,通过循环进行处理,如果用一个变量,得到的参数往往是最后一个设置的变量值,而不是值,
我想在 定义 
void GetPhoneNo_8000()时加上参数,
在 onFocusOutHandler.Fire = new ElementEventFire(GetPhoneNo_8000); 调用时穿进去,请教高手。

解决方案 »

  1.   

    首先,把你定义的delegate变成有参数的public delegate void ElementEventFire(object yourParameter);
    其次,onFocusOutHandler.Fire = new ElementEventFire(GetPhoneNo_8000);的时候只是把一个函数传给了onFocusOutHandler.Fire,这里并没有调用函数,根本不需要传参数然后,真正需要传参数的时候是它被显式调用的时候,比如onFocusOutHandler.Fire(yourObject);
    题外话,你的BrowserEventHandler里面的Fire要写get方法,否则它没法被调用到
      

  2.   

    回楼上,我调用是在:photo.onfocusout = onFocusOutHandler; 我在这里调用时如何传参数呢?
      

  3.   

    photo.onfocusout = onFocusOutHandler; 这里也只是把你产生的delegate赋给了photo.onfocusout
    你要显式地调用photo.onfocusout(yourObject);才可以传参数,但前提是photo.onfocusout的类型也要是你定义的这个带参数的delegate。如果这个类型你没法控制,那么就没法传参数了
      

  4.   

    上面有一点儿错误,调用应该是photo.onfocusout.Fire(yourObject);
      

  5.   

    需要改写ElementEventFire委托定义
    public delegate void ElementEventFire(参数列表);
    这样之后,想传几个参数就可以传几个参数了当然,你定义的方法签名也得跟这个委托一致void GetPhoneNo_8000(参数列表);//这里的参数列表跟上面一致onFocusOutHandler.Fire = new ElementEventFire(GetPhoneNo_8000);
    或者
    onFocusOutHandler.Fire = GetPhoneNo_8000;
      

  6.   

    mysword 你好,
    我对这个事件有些晕,你看就我上面给你的代码应该如何改才可以传入参数?我你该你了说的几个地方。但是photo.onfocusout没有Fire(yourObject)属性可用,
    直接 onFocusOutHandler.Fire2(参数),能传参数,但是不受 photo.onfocusout 控制,页面打开就直接被调用 GetPhoneNo_8000 方法。我如何 photo.onfocusout 中调用   GetPhoneNo_8000  并能带参数。
    请就上面的代码给个实例谢谢。
      

  7.   

    前面说了,要用Fire直接调用需要在BrowserEventHandler的Fire里面写get,这里你只写了set,所以没有Fire可用
    从你的BrowserEventHandler的定义来猜,你的函数调用大概是想在public bool Handler()
    {
          this.fire();
          return true;
    }里面调用,你要传参数也要在这里传参数
    比如public bool Handler(object yourObject)
    {
          this.fire(yourObject);
          return true;
    }
      

  8.   

    xiaozhi_5638  你好;”需要改写ElementEventFire委托定义
    public delegate void ElementEventFire(参数列表);
    这样之后,想传几个参数就可以传几个参数了当然,你定义的方法签名也得跟这个委托一致void GetPhoneNo_8000(参数列表);//这里的参数列表跟上面一致” 
    我都设置为了,但是在调用的时候又有新问题,
    1,
    onFocusOutHandler.Fire2 = new ElementEventFire2(GetPhoneNo_8001);
    onFocusOutHandler.Fire2("ddddd");
    时不受 photo.onfocusout  控制,页面打开就执行了。
    2,
     onFocusOutHandler.Fire2 = new ElementEventFire2(GetPhoneNo_8001);
     photo.onfocusout = onFocusOutHandler;
    这样用什么都不提示了
    void GetPhoneNo_8001(object ss)
            {
                if (ss == null)
                { MessageBox.Show("null"); }
                else
                {
                    MessageBox.Show(ss.ToString());
                }        }
      

  9.   

    你可以重载这么一个Handler函数,但是要想被调用,你需要找到你的程序里面到底是在哪里调用它的,如果这个是在某个库函数中,无法由你控制,那就没办法
      

  10.   


    我现在改成这样了/// <summary>
        /// BrowserEventHandler 的摘要说明。
        /// </summary>
        [ComVisible(true)]
        public sealed class BrowserEventHandler
        {
            private ElementEventFire fire;
            private ElementEventFire2 fire2;
            public ElementEventFire Fire
            {
                set { this.fire = value; }
                get { return fire; }
            }
            public ElementEventFire2 Fire2
            {
                set { this.fire2 = value; }
                get { return fire2; }
            }
            [DispId(0)]
            public bool Handler(object s)
            {
                this.fire(); // 这里写成 this.fire(s) 会报错。
                return true;
            }
        }    public delegate void ElementEventFire();
        public delegate void ElementEventFire2(string ss);
      

  11.   


    你好 能给个qq或 msn 吗,我在里面你看代码,谢谢。
      

  12.   


    我是在axWebBrowser控制网页,但是网页里有很多iframe,我又要控制 iframe里的网页,
    所以就要分析iframe页面里的元素,对元素进行控制,
    比如,iframe里的页面有个 input 输入框,当输入完后输入框失去焦点,我要得到他输入的内容,这样就用到了上面的代码,在输入完后触发调用一个方法,我给这个方法传入一些参数进去,才能分析出是哪个iframe里的页面输入的值。
      

  13.   


    ...
    this.fire(); // 这里写成 this.fire(s) 会报错。
    ...
    这里要用this.fire2(s);我觉得最重要的问题是找到哪里调用的Handler...