环境:VS.NET 2005
每个子窗体中都有一Public过程SaveData,在MDI窗体中按下某一按钮后通过ActiveMdiChild来调用子窗体中的SaveData过程在VB.NET中可以如下实现:
    Private Sub SaveToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveToolStripButton.Click
        If Not (Me.ActiveMdiChild Is Nothing) Then
            Dim ActiveChild = Me.ActiveMdiChild
            ActiveChild.SaveData()
        End If
    End Sub在C#中:
        private void saveToolStripButton_Click(object sender, EventArgs e)
        {            if (this.ActiveMdiChild != null)
            {
                
                Form ActiveChild;
                ActiveChild = this.ActiveMdiChild;
                ActiveChild.SaveData();
            }
出现错误提示:
错误 1 “System.Windows.Forms.Form”并不包含“SaveData”的定义不知大侠们如何解决类似的情况?

解决方案 »

  1.   

    在子窗体中的SaveData是如下定义:
     public void  SaveDate()
      {  }
      

  2.   

    把Private 改成 Public 试试
      

  3.   

    把Private 改成 Public 试试
    ===============================
    不知楼上的兄弟说的哪里?
    注意:private void saveToolStripButton_Click(object sender, EventArgs e)是MDI窗体中的事件
      

  4.   

    声明用的是Form,实现用的是MDIChild(实际上也是Form),没有任何一点是和楼主的子窗体有关的信息,CLR和C#编译器没法认出自定义窗体,所以当作普通Form对待,所以没有SaveData();建议楼主改一下方式.
      

  5.   

    ActiveChild 要转换成你的子窗体的类型,如下:
    private void saveToolStripButton_Click(object sender, EventArgs e)
    {
        if (this.ActiveMdiChild != null)
      {
        Form ActiveChild;
        ActiveChild = this.ActiveMdiChild;
        SubForm f=ActiveChild as SubForm;
            if (f!=null)
            {
            f.SaveData();
            }
      }
    }或用接口来实现,让你的所有子窗口都继承这个接口,然后,在主窗体的事件里通过接口来调用SaveData方法,这个方法最合适.
      

  6.   

    比如:
    private interface ISaveableForm
    {
        void SaveDate();
    }class SubForm:Form,ISaveableForm
    {
        ...
        public void  SaveDate()
        {
           
        }
    }在主窗体里:
    private void saveToolStripButton_Click(object sender, EventArgs e)
    {
        if (this.ActiveMdiChild != null)
      {
        Form ActiveChild;
        ActiveChild = this.ActiveMdiChild;
        ISaveableForm isf=ActiveChild as ISaveableForm;
            if (isf!=null)
            {
            isf.SaveData();
            }
      }
    }
      

  7.   

    谢谢两位先
    To:hbxtlhx(平民百姓) 
      你的第一种方法中用到了SubForm,而SubForm应该是某一子窗体的实例名称,用这种方法似乎只能对SubForm子窗体有用,而对其它的子窗体不起作用,第二种方法我还没看懂,再看看先To:sunrobust(咸鱼) 
    按你说的不知要怎样修改
      

  8.   

    而SubForm应该是某一子窗体的实例名称
    -----------
    是这样的,这样要分别对每个子窗体处理,
    在这种情况下用接口是最合适不过的了.
    建议你用第二种方法:接口实现.
      

  9.   

    To:hbxtlhx(平民百姓)
    按你的第二种方法添加了一接口:ISaveableForm,可还是不行
    出现错误提示:
    错误 1 “人事薪资管理系统2005.ISaveableForm”并不包含“SaveData”的定义
      

  10.   

    private interface ISaveableForm
    {
        void SaveDate();
    }
    我这里写成private了,应是非私有才行,经如public, internal等.
      

  11.   

    改成这样的:
    public interface ISaveableForm
    {
        void SaveDate();
    }
      

  12.   

    using System;
    using System.Collections.Generic;
    using System.Text;namespace 人事薪资管理系统2005
    {
        public interface ISaveableForm
        {
            void SaveDate();
        }
    }
    我是这样写的,可还是不行
      

  13.   

    你把你的所有有SaveDate方法的子窗体都继承自ISaveableForm了吗?如:
    public partial class SubForm: Form, ISaveableForm
    {
    ...
    public void SaveDate()
    {
    }
    }
      

  14.   

    已经OK了
    原来是SaveDate与SaveData的一字之差,真是不好意思
    真心感谢hbxtlhx(平民百姓)!!!