这些问题.应该很多人都会做.但我这两天在百度里找了很久.仍然没有答案..
.所以还得再请教一下大家.1.父窗体怎么调用子窗体中的事件:
 我的winform程式采用mdi方式..
  比如在父窗体(frmMain)处,有一个[新增学生]的按钮.点击后.弹出学生窗体(frmStudent),其中有一个列表(datagridview)用来显示学生的信息
  在frmStudent中.也有add,modify,delete等按钮.
  
  父窗体上.也有add,modify,delete按钮.我想.比如学生窗体为当前的活动窗体时.
   点击父窗体上的add,modify按钮.会调用frmStudent中的.add,delete等事件.
   也就是说.在父窗体上.也同样可以捞得到学生窗体中的列表数据.这样才可以新增修改嘛.2.子窗体如何修改父窗体中的控件值.  比如我弹出学生窗体.学生列表中有50名学生的数据.我希望能在父窗体frmMain的状态栏(statusstrip)中显示条数.
  如果是其它的窗体.则显示其它窗体的条数.  我知道有这么一个方法.
  TextBox txtNum= (TextBox)Application.OpenForms["MainForm"].Controls["textBox1"];
这样子可以设置.但是.无法对statusstrip中的label设值.  初写winform,感觉有点陌生...盼各位大侠回复指教..分不多..就这一些...

解决方案 »

  1.   

    1:将你的这些方法设置为public,这样你就可以直接通过对象方法。
    比如在frmMain中打开 sutdent。
    FrmStudent frmStudent=new FrmStudent();
    frmStudent.Add(...);
    frmStudent.Edit(..);
    这应用于一般的情况。
    反过来如果要子窗口修改父窗口里的内容,可以这样:
    FrmStudent frmStudent=new FrmStudent();
    frmStudent.Tag = this;
    在子窗口的相应处理程序中:
    frmStudent.Add(...)
    {
       ((FrmMain)Tag).Add(..);  //这个Add调用的是父窗口中的Add.
    }这只是一个大概的,初级的方法,如果涉及到复杂的流程,需要修改整体系统的架构,使用比如委托、消息。
      

  2.   

    并参考以下内容:
    http://topic.csdn.net/t/20020725/17/901996.html
    http://bbs.cfan.com.cn/thread-771079-1-1.html
    推荐下这个,手把手型。
    http://www.cnblogs.com/TZ-1983/articles/235188.html
      

  3.   

    不过对于你的应用需求来说我建议是这样:1:在子窗口中设置公共的Add,Edit,Delete方法。
    在父窗口中不再有相关的代码,即使有按钮,实际也应该通过调用子窗口的方法来执行!
    2:在父窗口中设置一个大体类似于UpdateData这样的公共方法,用于更新在父窗口中显示的有关子窗口的数据。
    比如:你在父窗口中显示了Student窗口的记录条数,当执行了ADD或者DELETE的时候要更新这个数据,那么在UpdateData中执行。3:当子窗口或者其它任何有可能导致数据变化的方法执行完成后(在上面提到的子窗口的add,edit,delete方法的最后),调用UpdateData来刷新父窗口显示。4:调用updateData时,可以直接访问对象,也可以使用委托甚至事件来完成。当然,这比较考验你的把握能力了。
      

  4.   

    哇.还是这里人气高.看来我以后要常来.先谢谢两位大大的解答..
    我先回复下phy的提示:1:将你的这些方法设置为public,这样你就可以直接通过对象方法。 
      
    我都将方法设为public,且在父窗体中都能够访问到.
    但这个访问.都是实例化访问..
    FrmStudent frmStudent=new FrmStudent();
    frmStudent.Add(); 这样子后.我在frmStudent中的那些控件值.都变成null值.运行起来会报错...2,frmStudent.Add(...)
    {
      ((FrmMain)Tag).Add(..);  //这个Add调用的是父窗口中的Add.
    } 我这边也能执行到这边.比如给父窗口中的控件设值..通过断点查看.都有执行到这里.
    可是在页面上就是不显示出来..再次谢谢..phy的链接提示.现在下班..我明天再来研究...
      

  5.   

    我目前的结果是这样父窗体可以执行到子窗体中的事件..但是.事件中都不能调用到子窗体中的控件值.
    因为这些值全部都变成'object 未定义'子窗体可以对父窗体中的值进行设置.比如定义一个属性.来get,set,
    但它就是不显示在页面上.初写winform,问题再怎么简单.都让我冒汗...BS自己下...
      

  6.   

    汇报下结果...第二个结果已经做出来..
    第一个.把那个我要修改的控件中的modifiers属性设为public第二个.就是通过构造函数.把mainform传来传去...感觉有点烦索..不过好像winform就是这么个写法..
     MainForm frmMain;
            public Report(MainForm frm)
            {
                InitializeComponent();
                frmMain = frm;
            }//修改值
    frmMain.txtNum="xxx";第一个问题..昨晚弄了.还是没有结果...继续弄吧...
      

  7.   

    标准的做法是使用委托和事件..不过对于初学者而言phy的方法是比较容易接受的
      

  8.   

    我太兴奋了.吃了条口香糖.就把问题给解决了.
    看来头脑清醒.是多么的重要啊..希望大家不要常加班.弄的走路都晕.方法如下:
    1.还是得把student中的datagridview的modifiers属性设为public 
    2.private void cmuModify_Click(object sender, EventArgs e)  //父窗体中的修改事件
            {
                Student frmStudent=null;
                for (int i = 0; i < this.MdiChildren.Length; i++)
                {
                    frmStudent= this.MdiChildren[i] as Student;
                }
                frmStudent.cmuModify_Click(this, null);  //执行子窗体中的事件. 此事件也要设成public类型
            
            }我之前的错误.就是每次执行时.都FrmStudent frmStudent=new FrmStudent(); 
    这样构造初始后..实际上应该是另外一个窗体了.所以访问上面的事件,及控件.都又是另外一回事了.为null
    谢谢phy的帮助...希望你能对我上面的解决方法.再给点评议..看是否正确...
    1.(在子窗口中设置公共的Add,Edit,Delete方法。)
      没错.子窗口中的我都把这些方法设置为public,这样在窗口时.就不管它.就直接调用这些方法就好..如果方法中的代码有变.也只要修改一处即可.2.(在父窗口中设置一个大体类似于UpdateData这样的公共方法,用于更新在父窗口中显示的有关子窗口的数据。 )
    我没有设置这样的一方法.我是把其中要显示的栏位.设为public,然后再在子窗体中刷新..因为每个子窗体可能要显示的文字不一样.3(3:当子窗口或者其它任何有可能导致数据变化的方法执行完成后(在上面提到的子窗口的add,edit,delete方法的最后),调用UpdateData来刷新父窗口显示。 )
    是这样子的.我不管他们执行什么动作.我只要看盯着datagridview.
    private void dgvStudent_DataSourceChanged(object sender, EventArgs e)
            {
                frmMain.txtNum.Text = ShowItemNum();
            }4.(调用updateData时,可以直接访问对象,也可以使用委托甚至事件来完成。)
    委托+事件,绝对是个好方法...以前在写web时,就感觉到了.
    不过初写winform,昨晚怎么调试.都没有实现出来...看来.还是没有透彻理解委托...只懂得一些基本应用...
      

  9.   

    另外,哪位朋友有空.再帮我解决另外一个问题..也是蛮急的.都没有找到解决方案http://topic.csdn.net/u/20080924/18/c359b1c5-1237-4e17-9468-e102e398cc71.html
    <<winfrom中的MonthCalendar 是否有類似web中的DayRender事件>>
      

  10.   

    可以参考一下这里的代码来解决问题。
    http://blog.csdn.net/zhzuo/archive/2004/04/05/22027.aspx
    http://blog.csdn.net/zhzuo/archive/2006/05/05/708941.aspx
      

  11.   

    很 简单
    在父窗体的单击事件里这样写
    public string  sql="";
    private void buttion_Click(object sender,EventArgs e)
    {
    sql=this.textbox.text.trim().tostring();
    form fr=new form(this);//this 代表父窗体
    fr.show
    }
    然后在子窗体中 想定义一个父窗体的对象 类型为private 具体代码如下:
    private form rm;
    然后重构子窗体的构造函数
    public f2(form f1)
    {
     rm=f1;
    }
    这样还没弄好 如果你要取得父窗体中的某个控件值 或者某个数据 你需要把父窗体中的 变量或者对象给定义为public
    然后在子窗体中 就可以访问了 
    string str=rm.sql;这样就可以了 
    如果需要刷新父窗体中的数据 你可以直接调用重新绑定数据就OK了