如题:如题:父窗体上有一工具栏按钮BUTTON1,子窗体上有一TEXTBOX2和BUTTON2,BUTTON1按钮按下后,调用BUTTON2的事件处理程序.BUTTON2的事件处理程序:
private void button2_Click(object sender, System.EventArgs e)
{
TextBox2.text="调用成功";
                   }我把button2_Click变成PUBLIC后还是不对,请高手解答.还有人说是要将子窗体作为参数传入父窗体,在子窗体内声明一个公有的EVENT,但我不知如何调用,请给点代码.

解决方案 »

  1.   

    窗體間的傳值問題,你可以用delegate或event來做,參見
    http://blog.csdn.net/tjvictor/archive/2006/06/23/824617.aspx
      

  2.   

    用delegate来做比较简单   
    还容易实现
      

  3.   

    在子窗体中写个public方法,button2_Click和button1_Click都调这个方法
      

  4.   

    设你的子窗体为FromSub,则在主窗体的Button1的Click事件中写如下的代码:
    private void button1_Click(object sender, EventArgs e)
    {
    FormSub f = this.ActiveMdiChild as FormSub;
    if (f != null)
    {
    f.callButtonclick();
    }
    }
    在FromSub中编写如下的代码:internal void callButtonclick()
    {
    //以下的两个语句都可以实现调用button1_Click事件.
    //button1.PerformClick();
    button1_Click(this.button1, new EventArgs());
    }
    private void button1_Click(object sender, EventArgs e)
    {
    MessageBox.Show("调用成功!");
    }按上面说的写好代码后运行试试看成功不!
      

  5.   

    很高兴hbxtlhx(平民百姓) 又回来了,你曾经用一个公用函数帮我解决了一个问题,再次谢谢
    我参考了一个其它的做法,你看对不对?
    用button的click示例,代码如下:
    public class ChildForm : System.Windows.Forms.Form
    {
      //
      public event EventHandler BtnClick;
      //
      private void button1_Click(object sender, System.EventArgs e)
      {
        if(this.BtnClick != null)
        {
          this.BtnClick(sender,e);
        }
      }
    }public class MainForm : System.Windows.Forms.Form
    {
      private void button1_Click(object sender, System.EventArgs e)
      {
        ChildForm cldForm = new ChildForm();
        cldForm.BtnClick+= new BtnClick(MainForm_BtnClick); 
      }
    }2、在ChildForm中设置公有Button,
    代码如下
    public Button button1;
    在MainForm中绑定button1的Click事件3、将ChildForm作为参数传递给MainForm,在MainForm中直接调用ChildForm中的方法。
    ------------------------------------------------------
     但我在cldForm.BtnClick+= new BtnClick(MainForm_BtnClick); 这一行出错,说找不到new BtnClick、MainForm_BtnClick这两个对象.我把MainForm_BtnClick改成this.button1_click也不对。
      

  6.   

    我在实现在MainForm中绑定button1的Click事件出了错,请hbxtlhx(平民百姓) 解释一下出错的原因,cldForm.BtnClick+= new BtnClick(MainForm_BtnClick); 自动感应没有new BtnClick这个东西,也没有MainForm_BtnClick这个东西。
      

  7.   

    1)cldForm.BtnClick+= new BtnClick(MainForm_BtnClick); 
    是在第一种方法中用到的吧,是不是改为如下:
    cldForm.BtnClick+= new EventHandler(MainForm_BtnClick); 
    private void MainForm_BtnClick(object sender, EventArgs e)
    {
    }2)方法能通过,但是觉得不是很专业.
    3)方法也没有问题,但是觉得没有必要把ChildForm作为参数传到MainForm,因为MainForm中有ActiveMdiChild 可用,只要看一下ActiveMdiChild 是不是ChildForm就行了,如果是就用强制转换就可以了.
      

  8.   

    把ChildForm作为参数传到MainForm,是不是先要在MainForm的构造函数中把ChildForm作为参数代进去
    private static childform mychild=null;
    public mainform(childform kk)
    {
    mychild=kk;
    InitializeComponent(); //
    // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
    //
    }
    这种做法好不好。还有我认为private void MainForm_BtnClick(object sender, EventArgs e)
    {
    }
    这里面是什么事都没有做呀!
      

  9.   

    其实event也是基于delegate的,所以我才建议你开始先试着使用delegate来做窗体间的传值,等熟悉了delegate的使用方法之后,再回头来看event就简单多了。
    to 还有我认为private void MainForm_BtnClick(object sender, EventArgs e)
    {
    }MainForm_BtnClick就是在Mainform中要委托的事件,在里面写上你要执行的代码就可以了。
    但是你的理解有些不对,你这样做的结果是,当你在mdi窗体中按下button后,会自动执行主窗体的button,而不是在主窗体按button后,会自动执行mdi窗体的button,你正好写反了。
      

  10.   

    我是想在主窗体按button后,会自动执行mdi窗体的button,所以在主窗体的BUTTON的事件处理中什么都不写,对吗?
      

  11.   

    把ChildForm作为参数传到MainForm,是不是先要在MainForm的构造函数中把ChildForm作为参数代进去
    ----------------------
    这种方法不太好,原因在于要先于MainForm建立一个子窗体才行,
    你可在MainForm中设一个childform 类型的变量,当用new childform()建立子窗体的时候用如下语句把子窗体"存起来":
    this.child = new childform();
    这样就可以通过this.child 来访问子窗体了.
    另外觉得private void MainForm_BtnClick(object sender, EventArgs e)
    {
    }
    没有什么实用的价值.
      

  12.   

    那就这样写就可以了,不用你写的这么麻烦
    mainForm中两个button,分别为button1和button2
    private void button1_Click(object sender, EventArgs e)
    {
          mdiForm3 temp = new mdiForm3();
          button2.Click += new EventHandler(temp.button1_Click);
          temp.Show();
    }mdi窗体中的button如下:注意是public的
    public void button1_Click(object sender, EventArgs e)
    {
          MessageBox.Show("dddd");
    }
    以上程序在vs2005下測試通過。
      

  13.   

    建议你还是先看看delegate吧。
    个人意见,仅供参考