我有两个窗体,一个叫F_now,另一个为F_main。
想实现这样的效果:当单击F_now中按钮后,将F_main中的webbrowser的Navigate赋值为一个新值,如“http://sina.com".
已有代码如下(调试不成功):
F_now窗体:
namespace XXX
{
    public partial class F_now : Form
    {
        public delegate void MyDelegate(); 
        public event MyDelegate MyEvent;
       
        public F_now()
        {
            InitializeComponent();
        }        private void btn_s_Click(object sender, EventArgs e)
        {
            MyEvent();
            
        }    }
}
F_main窗体:
namespace 广告互联
{
    public partial class F_main : Form
    {
        public F_main()
        {
            InitializeComponent();
            
        }
    public void show_now() //该方法是显示F_now的地方,是通过其它方式能够调用的(也就是说这儿是可以执行,类似于放到Load事件里的)
        {
            F_now frm_now = new F_now();
            frm_now.MyEvent += new System.EventHandler(this.frmMain_youEvent);
            frm_now.Show(this);
        }
        private void frmMain_youEvent(object sender, EventArgs e)
        {
            this.wbb_list.Navigate("http://www.sina.com");
        }
  }

解决方案 »

  1.   

    不好意思,上面的“namespace 广告互联”也应该写成“namespace XXX”
      

  2.   


    public partial class F_now : Form 
        { 
            public event EventHandler MyEvent;        protected virtual void OnEvent(object sender ,EventArgs e)
            {
                if (MyEvent != null)
                    MyEvent(sender, e);
            }        public F_now() 
            { 
                InitializeComponent(); 
            }         private void btn_s_Click(object sender, EventArgs e) 
            { 
                OnMyEvent(sender,e);
            } 
        } 
      

  3.   

    下面是调用OnEvent(sender,e),写错
      

  4.   

    cc_net谢谢你的答案。但仍然没有实现我想要的效果(点击F_now后F_main里的webbrowser属性没有被改变)。我测试了一下发现只有在两个窗体之间用你的方法能够实现由一个窗体里的控件改变另一个窗体里的控件属性,而不能实现三个窗体间的通信。因为我的f_main里的public void show_now()是由另外一个窗体(F_login)里的按钮控件触发的,也就是说在F_main和F_now之间还有一个窗体F_login.具体的窗体打开顺序是:打开F_main->点击F_main里的一个按钮->用该按钮事件打开F_login->再用F_login里的一个按钮事件触发F_main里的public void show_now()方法->打开F_now窗体->点击F_now窗体中的按钮事件,改变F_main里的webbrowser属性值。
      

  5.   

    那你应该在F_login里调用F_now里的MyEvent
    或者再监听一层
      

  6.   

    F_now 修改 F_main 应该没问题吧,你吧
    frm_now.MyEvent += new System.EventHandler(this.frmMain_youEvent); 
    放到构造函数中关于login调用F_now,一样的,在login中定义一个事件,在login中触发。
    main中也在构造函数中绑定这个事件
      

  7.   

    我又试了试,在F_main中的确收到了来自F_now传来的值(或者说监听到了事件,并执行了事件),但是并不是在原来的的F_main中,而是生成了另一个F_main,并且必须要加一个show()才能看到。
    也就是将这段代码:
    private void frmMain_youEvent(object sender, EventArgs e) 
            { 
                this.wbb_list.Navigate("http://www.sina.com"); 
            } 
    改成:
    private void frmMain_youEvent(object sender, EventArgs e) 
            {
                this.wbb_list.Navigate("http://www.sina.com.cn");
                [color=#FF0000]this.Show();[/color]
            } 但这样的话就多出了一个窗口,我不想这样!
      

  8.   


    namespace XXX 

        public partial class F_now : Form 
        { 
            public delegate void MyDelegate(string url); 
            public event MyDelegate MyEvent; 
          
            public F_now() 
            { 
                InitializeComponent(); 
            }         private void btn_s_Click(object sender, EventArgs e) 
            { 
                MyEvent("http://sina.com"); 
            }     } 

    F_main窗体: 
    namespace 广告互联 

        public partial class F_main : Form 
        { 
            public F_main() 
            { 
                InitializeComponent(); 
                
            } 
        public void show_now() //该方法是显示F_now的地方,是通过其它方式能够调用的(也就是说这儿是可以执行,类似于放到Load事件里的) 
            { 
                F_now frm_now = new F_now(); 
                frm_now.MyEvent += new System.EventHandler(this.frmMain_youEvent); 
                frm_now.Show(this); 
            } 
            private void frmMain_youEvent(string url) 
            { 
                this.wbb_list.Navigate(url); 
            } 
      } 

      

  9.   

     这样也行:namespace XXX 

        public partial class F_now : Form 
        { 
            public delegate void MyDelegate(); 
            public event MyDelegate MyEvent; 
          
            public F_now() 
            { 
                InitializeComponent(); 
            }         private void btn_s_Click(object sender, EventArgs e) 
            { 
                MyEvent(); 
                
            }     } 

    F_main窗体: 
    namespace 广告互联 

        public partial class F_main : Form 
        { 
            public F_main() 
            { 
                InitializeComponent(); 
                
            } 
        public void show_now() //该方法是显示F_now的地方,是通过其它方式能够调用的(也就是说这儿是可以执行,类似于放到Load事件里的) 
            { 
                F_now frm_now = new F_now(); 
                frm_now.MyEvent += new System.EventHandler(this.frmMain_youEvent); 
                frm_now.Show(this); 
            }         private void frmMain_youEvent() 
            { 
                this.wbb_list.Navigate("http://www.sina.com"); 
            } 
      } 

      

  10.   

    你好:patrickpan先生。
      你的代码中frm_now.MyEvent += new System.EventHandler(this.frmMain_youEvent); 应该写成:frm_now.MyEvent += new F_now.MYdeletegate(this.frmMain_youEvent); 才能调试成功。
      但问题依旧,依然要在frmMain_youEvent方法中加上一句this.show()才能看到更改后的webbrowser属性。而且会重新打开一个新的F_main窗口。
      

  11.   

    这个问题我最终解决了!没有用到事件、委托、静态变量等。
    首先在F_main中打开F_login:
    F_login frm2 = new F_login();
    frm2.Show();
    frm2.MdiParent = this;
    然后在F_login再打开F_now:
    this.Hide();
    F_now frm3 = new F_now();
    frm3.MdiParent = this.MdiParent;
    frm3.Show();
    最后在F_now里是这样控制F_main里的控件的(如Lable控件):
     private void button1_Click(object sender, EventArgs e)
            {
                ((Form1)this.MdiParent).label1.Text="abc";        }