使用反射来管理子程序的主窗体

目标:在主程序运行时打开子程序,并在主程序中根据一些逻辑来适时地隐藏和显示子程序的主窗体。

  最初的想法是使用启动进程的方式,但是这样要用到Win32的一些个API,还要找窗体什么的,另外操作进程占用资源也会多,所以主动放弃这个想法。于是想到使用反射来完成这个过程。

        string path;//程序集路径
        object myo;
        string typeForm;//窗体类型,是Form1或者Form2

        public ChildMsg(string pathAss, string typeForm)
        {
            this.path = pathAss;
            this.typeForm = typeForm;
        }
        //初始化
        private bool InitIt()
        {
            try
            {
                if (myo == null)
                {
                    Assembly mainAss = Assembly.LoadFrom(path);
                    myo = mainAss.CreateInstance(typeForm);
                    return true;
                }
            }
            catch
            {
                return false;
            }
            return false;
        }
        //打开方法
        public void OpenIt()
        {
            if (InitIt())
            {
                MethodInfo mi = myo.GetType().GetMethod("Show", new Type[] { });
                mi.Invoke(myo, null);
            }
        }
        //显示与隐藏
        public void Show(bool yes)
        {
            PropertyInfo pi = myo.GetType().GetProperty("Visible");
            pi.SetValue(myo, yes, null);
        }
        //关闭
        public void CloseIt()
        {
            MethodInfo mi = myo.GetType().GetMethod("Close", new Type[] { });
            mi.Invoke(myo, null);
        }

  感觉没有什么新鲜的,算是对反射的一个使用示例。这个类封装的不太好,希望多提宝贵意见。

时间: 2024-08-30 02:47:33

使用反射来管理子程序的主窗体的相关文章

WinForm MDi子窗体最大化导致子窗体标题栏和主窗体菜单栏合并问题的解决方法

在主窗体菜单栏的ItemAdded事件中编写如下代码: *msMain是我的主窗体菜单栏的Name属性值 //子窗体最大化不显示图标 private void msMain_ItemAdded(object sender, ToolStripItemEventArgs e) { if (e.Item.Text.Length == 0) { e.Item.Visible = false; } else { e.Item.Visible = true; } } 说明: 打开的子窗体最大化的时候,菜单

传窗体(例子是点完修改页面的修改后,直接在主窗体显示修改后的内容,不用再点一次查询)

private void button3_Click(object sender, EventArgs e) { if(listView1.SelectedItems.Count>0) { string x = listView1.SelectedItems[0].Text; supdate f = new supdate(this,x); //this是当前窗体,就是主窗体 f.Show(); } } private Score Y; private string X; public supd

传窗体 点完修改页面的修改后,直接在主窗体显示修改后的内容

private void button3_Click(object sender, EventArgs e) { if(listView1.SelectedItems.Count>0) { string x = listView1.SelectedItems[0].Text; supdate f = new supdate(this,x); //this是当前窗体,就是主窗体 f.Show(); } } private Score Y; private string X; public supd

20151124001 关闭C#主窗体弹出是否关闭对话框

关闭C#主窗体弹出是否关闭对话框 private void Frm_Main_FormClosing(object sender, FormClosingEventArgs e)        {            DialogResult TS = MessageBox.Show("确定要关闭并退出程序?", "退出提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);            if (TS

主窗体和继承窗体

程序将第一个创建的窗体作为主窗体.如果创建了一个后,在其他窗体尚未创建的时候便释放调,此时又创建了一个窗体,那么第二次创建的窗体就会变成主窗体了. 关闭主窗体,程序就认为是终止运行,并且调用 Free 释放掉主窗体资源,进而程序结束退出.而关闭其他非主窗体,程序只是将其隐藏起来了. 子窗体会将主窗体的属性方法继承下来,对于主窗体中手动增加的方法(即声明在访问控制级别private.protected.published.public 中的方法),除非显示的增加 virtual 关键字,并在子类中

C# Winform 登陆窗体跳转到主窗体,登陆窗体隐藏

不多说,直接上代码: //Login窗体隐藏 Login.Hide(); //声明主窗体 Main main = new Main(); //主窗体显示 main.ShowDialog(); //Login窗体关闭 this.Close(); 菜鸟整理,大虾勿喷,希望大虾不吝指教.

Winform主窗体设计

主窗体顶部为菜单按钮,子窗体内嵌入Panel显示 界面如下: 第二步,主窗体离不开的几个方法 1,点击菜单功能,加载子窗体 private void btnOpenForm_Click(object sender, EventArgs e)        {            try            {                string frmName = ((ButtonX)sender).Tag.ToString();                CloseForm()

2016.6.18主窗体、子窗体InitializeComponent()事件、Load事件发生顺序以及SeleChanged事件的发生

主窗体,子窗体的InitializeComponent(构造函数).Load事件执行顺序 1.主窗体定义事件 new 主窗体() 构造函数进入主窗体InitializeComponent函数,该函数中有各字框体的new创建语句,因此: 2.依次执行各子窗体InitializeComponent函数 3.主窗体new事件结束后,并不创建任何窗体或子窗体,也就没有任何Load事件发生.直到主窗体Show事件. 4.主窗体Show事件后,顺序执行各子窗体Load事件,注意!!并不是先执行主窗体Load

非主窗体在任务栏显示按钮(简单好用)good

非主窗体在任务栏显示按钮 type TForm2 = class(TForm) private { Private declarations } public { Public declarations } procedure CreateParams(var Params:TCreateParams); override; end; ... procedure TForm2.CreateParams(var Params: TCreateParams); begin inherited Cre