献上200分 为什么动态实例化的窗体无法在dockpanel上面打开?

wang520d 2009-05-20 11:30:03
直接实例化能打在dockpanel上面打开代码如下:

Frmselcoustomer obj = new Client.Frmselcoustomer();
obj.Show(this.dockPanel);


动态实例化的窗体无法附加到dockpanel上面,show完后是直接以弹出窗口的形式打开的 如下:

string p_AssemblyName = System.Reflection.Assembly.GetExecutingAssembly().ToString().Substring(0, System.Reflection.Assembly.GetExecutingAssembly().ToString().IndexOf(","));
Form objForm=LoadForm(p_AssemblyName, "Client.Frmselcoustomer");
obj.Show(this.dockPanel);

#region 实例化窗体

/// <summary>
/// 动态加载WINFORM窗体
/// </summary>
/// <param name="p_AssemblyName">程序集名 </param>
/// <param name="p_TypeForm">窗体类名 (全路径) </param>
/// <returns>Form实例 </returns>
private Form LoadForm(string p_AssemblyName, string p_TypeForm)
{
Assembly _Assembly = Assembly.Load(p_AssemblyName);
Type _FormType = _Assembly.GetType(p_TypeForm);
object _LoadForm = _FormType.InvokeMember(null, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null);
return (Form)_LoadForm;
}
#endregion


????是否我的实例化窗体的方法需要修改?请高人指点。。。。。。。
...全文
164 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
tulong403 2009-05-21
  • 打赏
  • 举报
回复
学习为主
rqx110 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 Dobzhansky 的回复:]
Frmselcoustomer obj = new Client.Frmselcoustomer();
obj.Show(this.dockPanel);

// 这里改
Form objForm=LoadForm(p_AssemblyName, "Client.Frmselcoustomer");
obj.Show(this.dockPanel);
//为:
DockContent objForm=LoadForm(p_AssemblyName, "Client.Frmselcoustomer") as DockContent;
obj.Show(this.dockPanel);


前提是你的 Client.Frmselcoustomer 派生自 DockContent.
[/Quote]

Dobzhansky 2009-05-21
  • 打赏
  • 举报
回复
Frmselcoustomer obj = new Client.Frmselcoustomer();
obj.Show(this.dockPanel);

// 这里改
Form objForm=LoadForm(p_AssemblyName, "Client.Frmselcoustomer");
obj.Show(this.dockPanel);
//为:
DockContent objForm=LoadForm(p_AssemblyName, "Client.Frmselcoustomer") as DockContent;
obj.Show(this.dockPanel);


前提是你的 Client.Frmselcoustomer 派生自 DockContent.

wang520d 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 Dobzhansky 的回复:]
对象怎么创建的不重要, 里来看下你代码中的要点

Frmselcoustomer obj = new Client.Frmselcoustomer();
obj.Show(this.dockPanel);


Form objForm=LoadForm(p_AssemblyName, "Client.Frmselcoustomer");
obj.Show(this.dockPanel);


再看下, DockContent 基类的带一个参数的 Show
public void Show(DockPanel dockPanel)

Form 的 Show
public void Show(IWin32Window owner)

DockPanel 派生自 Pan…
[/Quote]

有点眉目,type不对。。不是多态的。。搞不明白。有办法返回一个DockContent 的东西吗?是否返回一个DockContent 就可以了呢?
yangjiang113 2009-05-21
  • 打赏
  • 举报
回复
接分
帮顶
Dobzhansky 2009-05-21
  • 打赏
  • 举报
回复
对象怎么创建的不重要, 里来看下你代码中的要点

Frmselcoustomer obj = new Client.Frmselcoustomer();
obj.Show(this.dockPanel);


Form objForm=LoadForm(p_AssemblyName, "Client.Frmselcoustomer");
obj.Show(this.dockPanel);


再看下, DockContent 基类的带一个参数的 Show
public void Show(DockPanel dockPanel)

Form 的 Show
public void Show(IWin32Window owner)

DockPanel 派生自 Panel, 也实现了 IWin32Window 接口.


看出端倪了么?

有码为证:

int i = 0;
private void menuItemSolutionExplorer_Click(object sender, System.EventArgs e)
{
i++;
if (i == 2)
{
Form f = _solutionExplorer as Form;
f.Show(dockPanel);
}
else
{
DockContent c = _solutionExplorer as DockContent;
c.Show(dockPanel);
}
}


关键就是你反射后获取的 Type 不对, 那个函数不是多态的.


*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
Type of typeless
Root of rootless
jueyingfd 2009-05-21
  • 打赏
  • 举报
回复
如果你现在某个东西上面实例化一个东西,作为应用程序来说,更多的是用显示隐藏来做这个东西,直接把东西放到另外的pannel上面去,然后进行控制,而不是用窗体进行你这样的控制
tianwenjielove 2009-05-21
  • 打赏
  • 举报
回复
up
wang520d 2009-05-21
  • 打赏
  • 举报
回复
再补充一句如果该问题解决,本人愿意贴出框架动态生成源码以便大家更好完善该功能框架;
wang520d 2009-05-21
  • 打赏
  • 举报
回复
说下来龙去脉--之所以会用到窗体动态实例化:系统权限是通过数据库来控制,菜单也完全根据数据库的权限来动态生成到menu控件上面,所以菜单单击关联的窗体就需要动态实例化了;否则每加一个菜单就要加2行代码(实例化窗体、show窗体),这样是非常麻烦的,我想做到菜单完全通用,来一个新项目只需简单配置数据库就OK了。以前实现该过程是把窗体直接附加到一个panel上面(一切正常)。现在想完善框架用到了dockpanel,也就带来了此贴的问题;
wujinjian2008n 2009-05-21
  • 打赏
  • 举报
回复
up
中年秃头大叔 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wang520d 的回复:]
引用 1 楼 hubofly 的回复:
顶一下

首先我觉得你要明白这个运行机制,和窗体实例化后的机制问题

如果你现在某个东西上面实例化一个东西,作为应用程序来说,更多的是用显示隐藏来做这个东西,直接把东西放到另外的pannel上面去,然后进行控制,而不是用窗体进行你这样的控制,个人理解


个人认为动态实例化的结果页是一个FORM,而直接new出来的也是一个FORM。如果有什么不一样那就是动态实例化的方法参数设置得有…
[/Quote]
再顶一下.
wang520d 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hubofly 的回复:]
顶一下

首先我觉得你要明白这个运行机制,和窗体实例化后的机制问题

如果你现在某个东西上面实例化一个东西,作为应用程序来说,更多的是用显示隐藏来做这个东西,直接把东西放到另外的pannel上面去,然后进行控制,而不是用窗体进行你这样的控制,个人理解
[/Quote]

个人认为动态实例化的结果页是一个FORM,而直接new出来的也是一个FORM。如果有什么不一样那就是动态实例化的方法参数设置得有问题。所以希望有对动态实例化反射机制比较熟悉的朋友来帮忙
wenjie0728 2009-05-21
  • 打赏
  • 举报
回复
等达人
关注……
wang520d 2009-05-21
  • 打赏
  • 举报
回复
自己再顶一下。。希望有高人帮忙。
hubofly 2009-05-20
  • 打赏
  • 举报
回复
顶一下

首先我觉得你要明白这个运行机制,和窗体实例化后的机制问题

如果你现在某个东西上面实例化一个东西,作为应用程序来说,更多的是用显示隐藏来做这个东西,直接把东西放到另外的pannel上面去,然后进行控制,而不是用窗体进行你这样的控制,个人理解

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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