已知有 窗体1、窗体2:
窗体1中 有 button1控件,fun1方法;
窗体2中 有 button2控件;点击窗体1中button1时,显示窗体2(showdialog模式);
请问:怎么实现点击窗体2中的button2时,调用窗体1中的fun1方法?

解决方案 »

  1.   


        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public int Calculate(int i)
            {
                return ++i;
            }
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 frmTarget = new Form2();
                frmTarget.ShowDialog(this);
            }
        }    public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                MessageBox.Show(((Form1)this.Owner).Calculate(20).ToString());
            }
        }
      

  2.   

    关键:
    frmTarget.ShowDialog(this);
    MessageBox.Show(((Form1)this.Owner).Calculate(20).ToString());
      

  3.   

    thanks to dyshadow:
    有没有其它的方法,比如使用委托,请指点!
      

  4.   


        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public int Calculate(int i)
            {
                return ++i;
            }
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 frmTarget = new Form2();
                frmTarget.ShowDialog(this);
            }
            public void button2_Click(object sender, EventArgs e)
            {
                MessageBox.Show("TEST");
            }
        }    public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                MessageBox.Show(((Form1)this.Owner).Calculate(20).ToString());
            }        private void Form2_Load(object sender, EventArgs e)
            {
                this.button2.Click += new System.EventHandler(((Form1)this.Owner).button2_Click);
            }
        }
      

  5.   

    在FORM2中点button2后,使用的是FORM1里面的button2_Click
      

  6.   

    C# code
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public viod fun()     
            {
                return ++i;
            }
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 frmTarget = new Form2();
                frmTarget.ShowDialog(this);
            }
        }C# code
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                Form1 frmTarget = new Form1();
                return frmTarget.fun1()
        }
      

  7.   

    可以用javascript来实现在子窗口中调用父窗口中的javascript函数:window.opener.functionName();
      

  8.   

    这个使用了System.EventHandler这个委托。你当然可以自己写个委托,比如以下:
        public partial class Form2 : Form
        {
            public delegate int CalculateDelegate(int i);
            public Form2()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                MessageBox.Show(((Form1)this.Owner).Calculate(20).ToString());
            }        private void button2_Click(object sender, EventArgs e)
            {        }        private void Form2_Load(object sender, EventArgs e)
            {
                this.button2.Click += new System.EventHandler(((Form1)this.Owner).button2_Click);
            }        private void button3_Click(object sender, EventArgs e)
            {
                CalculateDelegate calculate = new CalculateDelegate(((Form1)this.Owner).Calculate);
                MessageBox.Show(calculate(20).ToString());
            }
        }
    Form1还是使用以上那个FORM
      

  9.   

    为什么 非要 调用他 重写不就可以吗?
    如果里面有窗体1的属性 传参过去不就行了吗?好像不行 不知道API行不
      

  10.   

    关键:
    public delegate int CalculateDelegate(int i); //申明一个委托
    CalculateDelegate calculate = new CalculateDelegate(((Form1)this.Owner).Calculate); //创建涵数实例(或者称绑定)
    MessageBox.Show(calculate(20).ToString()); //调用
      

  11.   


        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public void fun1()
            {
                
            }
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 frmTarget = new Form2(this);
                frmTarget.ShowDialog(this);
            }
        }
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }        private Form1 fm1;
            public Form2(Form1 fm)
            {
                this.fm1=fm;
            }
            private void button1_Click(object sender, EventArgs e)
            {
                fm1.fun1();
            }
        }
      

  12.   


    再问一下:
    如果form1中Calculate的函数是针对dataGridView1(form1的控件)的数据进行更新,请问怎么实现?
      

  13.   


    重写好像不行,
    但你说得没错,我就是想实现更新form1中的dataGridView1的数据,不知怎么实现?
      

  14.   


    对于本例,使用委托没有多大意义
    如果只是为了调用form2完成相关操作,并且更新form1的话
    直接在form1中操作就好了。 public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public void fun1()
            {
                
            }
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 frmTarget = new Form2(this);
                frmTarget.ShowDialog(this);
                //可以从form2中操作设置属性,表示是否操作成功
                  if(成功)
                 {
                  fun1();//更新datagridview
                 }
                if (frmTarget != null)
                    frmTarget .Dispose();
            }
        }
      

  15.   

    Thanks to ojlovecd:
    此方法可以解决我现在的问题!
      

  16.   

    看看我的博客,里面有你想要的功能:
    http://www.cnblogs.com/yongfei/archive/2008/04/30/1177111.html
    思路是一样的,用委托
      

  17.   

    第一个很简单不说了 说说第二个  首先定义一个全局的委托,指向窗体1的fun1方法 在窗体2调用该委托就可以了 学学委托 就可以解决这个问题