问题描述
1,工程是一个MDI窗体,父窗体中有多个MDI子窗体和工具栏菜单
2,有一个自定义控件,是属于MDI子窗体的,比如说这个MDI子窗体叫A,这个自定义控件叫a
3,想在a中调用MDI父窗体的一个菜单按钮事件我单纯想法是
在a里写
MDIParent m = new MDIParent();
m.菜单();
我想这样就可以执行那个父窗体中菜单事件了,但是出来没有效果
请问具体应该怎么写?
能不能敲几行代码给我?谢谢
1,工程是一个MDI窗体,父窗体中有多个MDI子窗体和工具栏菜单
2,有一个自定义控件,是属于MDI子窗体的,比如说这个MDI子窗体叫A,这个自定义控件叫a
3,想在a中调用MDI父窗体的一个菜单按钮事件我单纯想法是
在a里写
MDIParent m = new MDIParent();
m.菜单();
我想这样就可以执行那个父窗体中菜单事件了,但是出来没有效果
请问具体应该怎么写?
能不能敲几行代码给我?谢谢
if( m != null )
{
m.菜单();
}
我按1楼的写了,还是不行啊,还是和以前一样,代码能运行过去,但是不执行出效果
如果大家怀疑本身就没有效果可执行的话,那么我单纯去点击那个菜单是可以的啊private void pbox_Return_Click(object sender, EventArgs e)
{
MDIParent mdiFrame = this.Parent as MDIParent;
if (mdiFrame != null)
{
mdiFrame.NavMenuItem_Click(sender,e);
}
}
你能引用处理方法?NavMenuItem_Click?这样不行,,你mdiFrame.菜单.Click();
mdiFrame.后面出不来菜单啊?智能提示没有,可能是私有的
我把MDIParent的InitializeComponent()函数改成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
不是用Parent是MDIParent属性得到父窗体
然后再找到那个菜单(ToolStripMenuItem),然后是这个菜单.PerformClick()
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#的确有点不习惯,好在是解决了。呵呵
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();
}