社区
C#
帖子详情
如何动态打开Form窗体
boxerwg
2009-02-25 08:15:55
要调用一个已经建好的窗体Form2,窗体名称存在数据库中,我在数据库中查询到我将要打开的窗体是Form2.
如string openForm="Form2";但是如何找开这个窗体呢?
...全文
344
13
打赏
收藏
如何动态打开Form窗体
要调用一个已经建好的窗体Form2,窗体名称存在数据库中,我在数据库中查询到我将要打开的窗体是Form2. 如string openForm="Form2";但是如何找开这个窗体呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
linlin1972
2009-02-25
打赏
举报
回复
假定条件:
1、调用窗体可能在不同的程序集、使用不同的命名空间
2、调用窗体可能会是后期开发
如果以上两个条件有一个不满足,都可以使用以下方法:
Switch (OpenForm)
{
case "Form2"
Form2 frm=new Form2();
frm.Show();
break;
case ""
...
}
如果以上两个条件可能同时存在,就需要通过反射来实现。
使用反射方式时,数据库中的数据必须能够提供窗体所在的程序集名称、命名空间、类名,然后使用zgke提供的代码来实现
[Quote=引用 1 楼 zgke 的回复:]
调用:
((Form)LoadForm("程序结名","命名空间.Form1")).Show();
方法:
/// <summary>
/// 动态加载WINFORM窗体
/// </summary>
/// <param name="p_AssemblyName">程序集名 </param>
/// <param name="p_TypeForm">窗体类名 (全路径) </param>
/// <returns>Form实力 </returns>
private object 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 _LoadForm;
}
[/Quote]
birdlonger
2009-02-25
打赏
举报
回复
[Quote=引用 4 楼 dayizhixiaotutu 的回复:]
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern int FindWindow(string lpClassName, string lpWindowName);
int window_Handler = FindWindow(null, @"Form2");
[/Quote]
用楼上获得的句柄 (window_Handler)
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, ShowWindowStyles State);
ShowWindow (window_hanlder,5);
就可以显示.
这是windows里面对ShowWindwoStyles的定义.
public enum ShowWindowStyles : short
{
HIDE = 0,
SHOWNORMAL = 1,
NORMAL = 1,
SHOWMINIMIZED = 2,
SHOWMAXIMIZED = 3,
MAXIMIZE = 3,
SHOWNOACTIVATE = 4,
SHOW = 5,
MINIMIZE = 6,
SHOWMINNOACTIVE = 7,
SHOWNA = 8,
RESTORE = 9,
SHOWDEFAULT = 10,
FORCEMINIMIZE = 11,
MAX = 11
}
anguslaigz
2009-02-25
打赏
举报
回复
up
herohero55
2009-02-25
打赏
举报
回复
使用打开窗体方法:
this.OpenDialogWithParm(类路径,参数);
打开子窗体接收参数,执行行load事件
private void Form_Load(object sender, EventArgs e)
{
object[] pt = new object[1];
pt = null;
pt = this.ObjectParm as object[];
//ID为上级窗体传的参数
string ID = pt[0].ToString();
}
类路径就是可以设为变量,这样就可以动太打开任意FORM
boxerwg
2009-02-25
打赏
举报
回复
改个问法吧,我已经把我要打开的窗体名称定义为一个string :
如:string openForm="Form2";
不用Form2 fm=new Form2();
Fm.open();
打开窗体,而是得用openForm来打开"Form2"
我想用Form fm=(Form)openForm;但提示string类型无法转换成System.Windows.Forms.Form
即要打开的窗体名称是通过openFormp这个变量来传递的
wenrenhua08
2009-02-25
打赏
举报
回复
public static object LoadForm(string form2)
{
Type type = Type.GetType(reader.GetAttribute("form2"));
object obj = Activator.CreateInstance(type); // 创建新对象
return obj
}
youyouke
2009-02-25
打赏
举报
回复
这样可以吗?
if(openForm=="Form2")
{
form2 fm=new form2();
fm.open();
}
dayizhixiaotutu
2009-02-25
打赏
举报
回复
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern int FindWindow(string lpClassName, string lpWindowName);
int window_Handler = FindWindow(null, @"Form2");
boxerwg
2009-02-25
打赏
举报
回复
我是新手,能不能说的详细一些
dyshadow
2009-02-25
打赏
举报
回复
使用FINDWINDOW的API函数
zgke
2009-02-25
打赏
举报
回复
可以根据反射来做.但你必须知道程序集的名称 和Form命名空间
((Form)LoadForm("程序结名","命名空间.Form1")).Show();
/// <summary>
/// 动态加载WINFORM窗体
/// </summary>
/// <param name="p_AssemblyName">程序集名</param>
/// <param name="p_TypeForm">窗体类名 (全路径)</param>
/// <returns>Form实力</returns>
private object 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 _LoadForm;
}
linlin1972
2009-02-25
打赏
举报
回复
例如:在MyCompany.MyClass.Dll中有一个窗体MyCompany.MyClass.MyForm,数据库中该窗体记录为MyCompany.MyClass|MyCompany.MyClass.MyForm
(注:一般情况下程序集名称和对象命名空间是一样的,但理论上是可以不一样的,所以数据库中两项都要记录)
使用时:
string openForm=dr["FormName"].ToString().Trim();
string[] openFormTemp=openForm.Split(new char[]{'|'});
string aName=openFormTemp[1];
string cName=openFormTemp[2];
System.Reflection.Assembly _Assembly = System.Reflection.Assembly.Load(aName);
Type _FormType = _Assembly.GetType(cName,true,true);
object _LoadForm = Activator.CreateInstance(_FormType, null);
Form frm=_LoadForm as Form;
if (frm !=null)
{
frm.Show();
}
boxerwg
2009-02-25
打赏
举报
回复
还是不成,能不能给个实例
C# 用
窗体
的名字Name
打开
窗体
这篇博客介绍了如何在C#的Windows
Form
s应用中,通过
窗体
名称
动态
创建并
打开
新的
窗体
。作者展示了在
Form
1中创建一个按钮,当点击按钮时,利用反射机制找到指定名称的
窗体
(如
Form
2)并实例化显示。这种方法为程序提供了灵活的
窗体
管理方式。
C#实现
窗体
动态
传值
本文介绍了如何在C#中利用Application.Open
Form
s属性和
Form
.Controls集合来实现
窗体
间的
动态
传值。通过示例和相关资源,展示了获取已
打开
窗体
及其控件的方法,帮助开发者更高效地进行
窗体
交互。
# Win
Form
开发系列 -
Form
/Window
本文深入探讨了Win
Form
开发中
Form
控件的多种应用与技巧,包括对话框、系统载入提示、类QQ提示框、不规则
窗体
等。详细解答了如何在MDI中使子
窗体
只保留一个实例、程序运行唯一性、模式窗口显示进度条、创建悬浮窗口、登录窗口设计、主
窗体
与子
窗体
交互、合理关闭
窗体
等问题。此外,还涉及了无
窗体
界面制作、自定义
打开
文件对话框、
动态
翻书效果、移动
窗体
、QQ弹出窗口、截图、多语言切换、输入对话框、绘制
窗体
等功能。
Win
form
让
Form
窗体
切换前置及活动状态
本文介绍如何在程序中通过设置
Form
form
1的TopMost属性,实现
动态
切换多个
打开
的
Form
窗体
的活动状态,并确保活跃
窗体
始终置顶。使用TopMost=true临时置顶,再设置为false放回正常层级,确保了窗口管理的灵活性。
C#(反射,特性),利用C#反射与特性获得程序集下的
窗体
与特性说明。
本文介绍了C#中的反射机制,如何利用反射
动态
创建对象并调用方法。通过示例展示了如何获取程序集中继承自
Form
的类,并利用Description特性为
窗体
添加说明。在主
窗体
加载时,将所有
窗体
类及其描述显示在ListView中,用户双击项即可
打开
相应
窗体
。此外,详细解释了如何添加和访问特性。
C#
111,129
社区成员
642,541
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章