MDI窗体的问题:父窗体的菜单中的功能是生成子窗体;子窗体的树形菜单也是生成一些父窗体的子窗体。请问怎么直接调用父窗体的菜单功能?

glgzx 2008-01-24 09:14:43
MDI窗体的问题:父窗体的菜单中的功能是生成子窗体;子窗体的树形菜单也是生成一些父窗体的子窗体。请问怎么直接调用父窗体的菜单功能?
...全文
312 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
benyouyong 2008-01-25
  • 打赏
  • 举报
回复
父窗体 obj父窗体=new 父窗体();
obj父窗体.Controls["父窗体控件名"].....

只是实例化父窗体,写在带TREEVIEW控件的子窗体里的,获得控件对象然后调用它的生成子窗体的方法就能用了。
glgzx 2008-01-25
  • 打赏
  • 举报
回复
楼上的回答是又新建立了一个父窗体。我的父窗体的菜单功能是建立子窗体。你的这种操作是可以调用,但是生成并显示子窗体的功能却不能用这种方法实现。
glgzx 2008-01-25
  • 打赏
  • 举报
回复
请教26楼。我的父窗体的菜单名menutrip1;如果想调用子菜单的一个命令,具体怎么使用。能否贴个代码。 偶不会用controls。生成子窗体的方法应该怎么调用?
manonroad 2008-01-24
  • 打赏
  • 举报
回复
用TreeNode的Tag来放对应ToolStripMenuItem。

在父窗口定义如下方法,根据用来产生不同的TreeView给不同的子窗口。


private MenuStrip strip = new MenuStrip();
private ToolStripMenuItem menu1;
private ToolStripMenuItem menu2;
private ToolStripMenuItem menu3;
private ToolStripMenuItem menu4;

TreeView GenerateTree(int formID)
{
TreeView treeView = new TreeView();
switch(formID)
{
case 0:
TreeNode node1 = new TreeNode();
node1.Tag = menu1;
TreeNode node2 = new TreeNode();
node2.Tag = menu2;
treeView.Nodes.Add(node1);
treeView.Nodes.Add(node2);

break;
case 1:
TreeNode node3 = new TreeNode();
node3.Tag = menu2;
TreeNode node4 = new TreeNode();
node4.Tag = menu3;
treeView.Nodes.Add(node3);
treeView.Nodes.Add(node4);

break;
case 2:
TreeNode node5 = new TreeNode();
node5.Tag = menu3;
TreeNode node6 = new TreeNode();
node6.Tag = menu4;
treeView.Nodes.Add(node5);
treeView.Nodes.Add(node6);
break;
default:
break;

}
return treeView;
}





在各自的子窗口

TreeView menuTree;
public Form1(TreeView menuTree)
{
this.menuTree = menuTree
this.menuTree.Click += TreePerformClick;
}

private void TreePerformClick(object sender, EventArgs e)
{
TreeNode node = menuTree.SelectedNode;
if(node.Tag != null)
{
ToolStripMenuItem menu = node.Tag as ToolStripMenuItem;
if(menu != null)
{
menu.PerformClick();
}
}
}



应该可以了。
glgzx 2008-01-24
  • 打赏
  • 举报
回复
20楼请仔细阅读我的那些答复后再作答,我哪里说用过toolbar了,我用的是treeview.
glgzx 2008-01-24
  • 打赏
  • 举报
回复
楼上请仔细看一下我的那些答复。我哪里说用工具条?我用的是树形菜单,TREEVIEW。请不要答非所问。
sdsd46529531 2008-01-24
  • 打赏
  • 举报
回复
尽量不要在子窗体加 工具条啊 不然最大化的时候会把子窗体的工具条合并到父窗体里
glgzx 2008-01-24
  • 打赏
  • 举报
回复
C#里面可以直接用call调用吗?
针对manonroad的回复:我的父窗体是menutrip控件。子窗体是treeview;如果仅仅是共享一些数据或传递普通值的话,那么可以实例化类然后调用一个方法。但我的菜单命令中是包含生成子窗体的代码的。
manonroad 2008-01-24
  • 打赏
  • 举报
回复
reference引用而已。
在每一个字创口定义一个TreeView

TreeView treeView;

public TreeView MenuView
{
set{treeView = value;}
}

或者直接在每个子窗口的Constructor中传递。
public ChildForm(TreeView menuTree)
{
this.treeView = menuTree;
}

用reference object是典型的在不同窗口间传递值或者共享数据方法。
有时候共享数据多的话,写一个control类,然后把它放到每个子窗口中。可以实现共享方法或者其他objects,当然也包括菜单之类的。

Good luck!
zhaoguoqingluntan 2008-01-24
  • 打赏
  • 举报
回复
抽像接口啊.面向对像的思想.
wzuomin 2008-01-24
  • 打赏
  • 举报
回复
那就这样子吧

Public Class Form1

Public Sub OpenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenToolStripMenuItem.Click
Dim frm As New Form2
frm.MdiParent = Me
frm.Show()
End Sub

End Class

Public Class Form2
Private Sub TreeView1_NodeMouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseDoubleClick
Call Form1.OpenToolStripMenuItem_Click(Nothing, Nothing)
End Sub
End Class
glgzx 2008-01-24
  • 打赏
  • 举报
回复
楼上的理解有误,有可能是我没有描述清楚。我在父窗体中的菜单功能(生成并显示子窗体的功能)都写好了,我只是需要在子窗体的菜单功能中直接去调用父窗体的菜单。因为子窗体好几十个。如果全部复制一遍代码到子窗体的代码里,给以后的维护增加了很多不便,我想把控制全部集中在父窗体的菜单命令中。
wzuomin 2008-01-24
  • 打赏
  • 举报
回复

Public Class Form1

Private Sub CloseToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CloseToolStripMenuItem.Click
Me.Close()
End Sub

Private Sub NewChildFormToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NewChildFormToolStripMenuItem.Click
Call TheChildFormNodeClick()
End Sub

Private Sub TheChildFormNodeClick()
Dim frm As New Form2
frm.MdiParent = Me
AddHandler frm.OpenNewChildForm, AddressOf TheChildFormNodeClick
frm.Show()
End Sub

End Class

Public Class Form2

Event OpenNewChildForm()

Private Sub TreeView1_NodeMouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseDoubleClick
RaiseEvent OpenNewChildForm()
End Sub

End Class

smaworm 2008-01-24
  • 打赏
  • 举报
回复
理解有错误,好像不能直接调用,不行就把父窗体的代码在子窗体里写一遍咯
只需要把
newMDIChild.MdiParent = this;
改成
newMDIChild.MdiParent = this.parent;
glgzx 2008-01-24
  • 打赏
  • 举报
回复
因为父窗体的菜单命令是生成并显示子窗体的操作。因此不能采用一般的实例化类并调用其方法的办法。请大家集思广益呀。帮帮偶。
AndrewITBOY 2008-01-24
  • 打赏
  • 举报
回复
路过.....
顺便学习下
glgzx 2008-01-24
  • 打赏
  • 举报
回复
怎么调用父窗体的菜单事件。能否贴个代码看一下。
Modifiers属性改过了,但好象没有什么用。
glgzx 2008-01-24
  • 打赏
  • 举报
回复
我的子菜单是个树形菜单。用的是treeview
wzuomin 2008-01-24
  • 打赏
  • 举报
回复
修改menutrip1的Modifiers属性试试看
glgzx 2008-01-24
  • 打赏
  • 举报
回复
this.parent的后面怎么调菜单?我的父窗体的菜单名为menutrip1;可楼上这种调用没办法出来this.parent.menutrip1呀
加载更多回复(7)

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧