问题描述
1,工程是一个MDI窗体,父窗体中有多个MDI子窗体和工具栏菜单
2,有一个自定义控件,是属于MDI子窗体的,比如说这个MDI子窗体叫A,这个自定义控件叫a
3,想在a中调用MDI父窗体的一个菜单按钮事件我单纯想法是 
在a里写
MDIParent m = new MDIParent();
m.菜单();
我想这样就可以执行那个父窗体中菜单事件了,但是出来没有效果
请问具体应该怎么写?
能不能敲几行代码给我?谢谢

解决方案 »

  1.   

    MDIParent m = this.Parent as MDIParent; 
    if( m != null )
    {
      m.菜单();
    }
      

  2.   

    别new啊,,new了还有个屁。。一楼应该已经给你解决了
      

  3.   

    Menu M = (Menu)Application.OpenForms["A"];
      

  4.   

    谢谢各位
    我按1楼的写了,还是不行啊,还是和以前一样,代码能运行过去,但是不执行出效果
    如果大家怀疑本身就没有效果可执行的话,那么我单纯去点击那个菜单是可以的啊private void pbox_Return_Click(object sender, EventArgs e)
            {
                MDIParent mdiFrame = this.Parent as MDIParent;
                if (mdiFrame != null)
                {
                    mdiFrame.NavMenuItem_Click(sender,e);
                }            
            }
      

  5.   


    你能引用处理方法?NavMenuItem_Click?这样不行,,你mdiFrame.菜单.Click();
      

  6.   

    mdiFrame.菜单.Click();
    mdiFrame.后面出不来菜单啊?智能提示没有,可能是私有的
    我把MDIParent的InitializeComponent()函数改成pub的也出不来
      

  7.   

    能出来了,我把这个菜单改成pub了
    但是运行的时候
    private void pbox_Return_Click(object sender, EventArgs e)
            {
                MDIParent mdiFrame = this.Parent as MDIParent;
                if (mdiFrame != null)
                {
                    mdiFrame.NavMenuItem.Click(sender,e);//这行报错
                }            
            }
    错误 1 事件“System.Windows.Forms.ToolStripItem.Click”只能出现在 += 或 -= 的左边 F:\Client\3ELink\usCustomerQuery.cs 80 38 3ELink
      

  8.   


    不是用Parent是MDIParent属性得到父窗体
    然后再找到那个菜单(ToolStripMenuItem),然后是这个菜单.PerformClick()
      

  9.   

    我搞好了,分享下用法
    1。添加一个全局的属性
    也就是在A上(mdi窗体)
    MDIParent mdiFrame = null;
            public fomCustomer(MDIParent m)
            {
                mdiFrame = m;
    2.加载自定义控件
    usCustomerQuery CustomerQuery = new usCustomerQuery(mdiFrame);//注意这里加载了属性mdiframe
                CustomerQuery.Parent = this;
                CustomerQuery.Dock = DockStyle.Fill;
                CustomerQuery.Show(); 
    3.自定义控件的初始化,也就是属性传递public MDIParent mdi = null;
            public usCustomerQuery(MDIParent m)
            {
                InitializeComponent();
                mdi = m;//这里,我们就可以用Mdi变量引用父窗体的所有函数了
            }4.引用private void pbox_Return_Click(object sender, EventArgs e)
            {
                if (mdi != null)
                    mdi.NavMenuItem_Click(sender,e);//引用了父窗体中NavMenuItem菜单的处理方法
            }
    总结:
    这里是MDI父-MDI子-MDI子中的自定义控件,这三层引用。由于都是动态引用,造成MDI父的方法不能被MDI子中自定义控件直接引用,所以要通过一个共同的属性来传递,这个属性也可以理解为C++中的指针或者句柄。刚用C#的确有点不习惯,好在是解决了。呵呵
      

  10.   

    给你个代码吧。
     ParentForm pf = this.MdiParent as ParentForm ;
                if (pf != null)
                {
                     //menuStrip1 是你添加到父窗体的那个菜单的Name值,
                    Control[] sss = pf.Controls.Find("menuStrip1", true);
                    MenuStrip ms = sss[0] as MenuStrip;
                     //文件ToolStripMenuItem 是菜单项的Name值 ,比如我添加的是文件,菜单,它的Name值是"文件ToolStripMenuItem" 这个是自动的
                    ToolStripMenuItem ts = ms.Items.Find("文件ToolStripMenuItem", true)[0] as ToolStripMenuItem;
                    ts.PerformClick();               
                   //其实你把文件ToolStripMenuItem定义成public 那直接就可以pf.文件ToolStripMenuItem.PerformClick();
                }
      

  11.   

      ToolStripMenuItem ts = ms.Items.Find("文件ToolStripMenuItemm", true)[0] as ToolStripMenuItem;报错,引用超出数组界限这是什么原因.我是新手