我在类里面分装了一个动态创建MenuStrip的方法
这个MenuStrip的信息是菜单信息然后为子菜单添加click方法
代码如下:
  //为功能节点添加单击事件
                if (dv[i]["url"] + "" != "")
                {
                    subMenu.Tag = dv[i]["url"] + "";
                    //如果当前方法为非静态方法
                    //那么public static Delegate CreateDelegate(Type type, object firstArgument, MethodInfo method, bool throwOnBindFailure)
                    // 创建指定类型的委托,该委托表示要按指定的大小写敏感度对指定类实例调用的指定实例方法。
                    //Activator.CreateInstance(T)
                    //创建实例方法的委托
                    Delegate EventAgent = Delegate.CreateDelegate(typeof(EventHandler), Activator.CreateInstance(T), T.GetMethod(dv[i]["url"] + "", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance), false);                    subMenu.Click += EventAgent as EventHandler;                }代码都是好的现在的问题是
当我在窗体中(Form1)
点击一个菜单项的时候
要弹出子菜单的窗体
此时的Form1为父窗体
弹出的为子窗体但是不能实现这个效果
代码如下
       
public void Add(object sender, EventArgs e)
        {
             Form2 ChildWin=new Form2();
             ChildWin.MdiParent = this;//这个代码无效
             ChildWin.Show();
        }

解决方案 »

  1.   

    Delegate EventAgent = Delegate.CreateDelegate(typeof(EventHandler), this, T.GetMethod(dv[i]["url"] + "", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance), false);改一下试试
      

  2.   

    T是谁?
    Type T = this.GetType();
    Delegate EventAgent = Delegate.CreateDelegate(typeof(EventHandler), subMenu, T.GetMethod("Add", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance), false);测试一下..
      

  3.   

    Delegate EventAgent = Delegate.CreateDelegate(typeof(EventHandler), this, "Add");
    //测试一下..//确保不创建新实例,(不使用Activator.CreateInstance)
    //确保被执行函数所在的对象为 this
      

  4.   

             
                Delegate EventAgent = Delegate.CreateDelegate(typeof(EventHandler), this, "Add");
                this.button1.Click += (EventHandler)EventAgent;        }        public void Add(object sender, EventArgs e)
            {
                MessageBox.Show("2");
            }我这么测的是没错的,你再检查下吧
      

  5.   


    我的这个封装MenuStrip的方法
    在一个类库里面
    窗体里面是直接调用的DLL
    你这个this 这样写在当前窗体肯定没有问题
    在类库里面这样肯定不行的
      

  6.   


    我的方法没有问题
    在窗体可以执行click 事件
    现在的问题是
    在click里面
    的MDiParent无效
      

  7.   

    看看this是什么类型,使用Parent 看看
      

  8.   

    this如果是Form的话,先写一句
    this.IsMdiContainer = true;
    试试。
      

  9.   

              Delegate EventAgent = Delegate.CreateDelegate(typeof(EventHandler), this, "Add");
                this.button1.Click += (EventHandler)EventAgent;
            }
            public void Add(object sender, EventArgs e)
            {
                Form2 f = new Form2();
                f.MdiParent = this;
                f.Show();
            }
    没按你写的测,我这么测有效
      

  10.   

    你这里的this 是form1
    我那个里面的是
    是动态创建Menustrip的类
    class CMenuStrip
      

  11.   

                CMenuStrip
                {
                    private Form formParent;
                    public CMenuStrip(Form parent)
                    {
                        formParent = parent;
                        //...
                    }
                }
                public void Add(object sender, EventArgs e)
                {
                    Form2 f = new Form2();
                    f.MdiParent = formParent;
                    f.Show();
                }           Form1内:
                CMenuStrip cs = new CMenuStrip(this);
      

  12.   

    如果Add是在Form1内的话就
    Delegate EventAgent = Delegate.CreateDelegate(typeof(EventHandler), formParent, "Add");
      

  13.   


    谢谢
    已经搞定!
    如果对应要使用那个Mdiparent
    就不能使用反射动态创建
    要使用对应的Form作为模板