WinForm 多窗体

多窗体:
一、首先要想到的问题是:
1、哪个是主窗体
问题:主窗体隐藏了,关闭其它窗体后,没有将主窗体显示/关闭,那么程序就关不上了

方法:用构造函数传值,将窗体传到另一个窗体中去

Form1:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 多窗体
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Form1为登录窗体,Form2为主窗体,
            //如何通过Form1的按钮打开Form2,然后让Form1隐藏Form2显示
            Form2 f2 = new Form2(this);

            f2.Show();

            this.Hide();//this当前窗体,指的是Form1,然后Hide隐藏

        }
    }
}

Form2:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 多窗体
{
    public partial class Form2 : Form
    {
        Form1 F1 = null;
        public Form2(Form1 f1)
        {
            InitializeComponent();
            F1 = f1;
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            F1.Close();
        }
    }
}

2、窗体只能打开一个

创建一个全局的泛型集合,为了放置全部打开的窗体
1、在窗体打开之前,判断集合中是否有name一致的窗体,如果有就说明已经打开了,就不要再打开了

问题:当窗体打开了,关闭后,就无法再次打开了
办法:当窗体关闭时,清除Form1中集合中的此窗体对象记录

Form1:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 多窗体
{
    public partial class Form1 : Form
    {
        //创建一个全局的泛型集合
        List<Form> Flist = new List<Form>();
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            bool has = false;
            //Form1为登录窗体,Form2为主窗体,
            //如何通过Form1的按钮打开Form2,然后让Form1隐藏Form2显示
            Form2 f2 = new Form2(this);
            foreach (Form F in Flist)//先遍历集合,看里面是否有窗体和Form2窗体一样的内容
            {
                if (F.Name == f2.Name)//若果有匹配内容
                {
                    has = true;
                }
            }
            if (has)//如果has是true
            {

            }
            else//如果has不是true
            {
                Flist.Add(f2);
                f2.Show();
            }

        }
//问题:点击按钮打开一个窗体,关闭这个窗体后再点击就无法打开窗体了
        //办法:在Form2关闭时,把Form1当中的集合清空掉,在Form2中调用Form1中的方法
        public void DeleteForm(Form F)
        {
            Flist.Remove(F);//这里写的是要移除的
        }
    }
}

Form2:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 多窗体
{
    public partial class Form2 : Form
    {
        Form1 F1 = null;
        public Form2(Form1 f1)
        {
            InitializeComponent();
            F1 = f1;
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            //防止报错,判断一下
            if (F1 != null)
            {
                F1.DeleteForm(this);
            }
        }
    }
}

问题:当窗体已经打开,再次点击打开按钮,不会将已打开的窗体重新显示并焦点进入
办法:找到已打开对象,将WindowState属性设置为:
        找到已打开窗体的对象,使用Focus方法;

Form1:

 private void button1_Click(object sender, EventArgs e)
        {
            bool has = false;
            //Form1为登录窗体,Form2为主窗体,
            //如何通过Form1的按钮打开Form2,然后让Form1隐藏Form2显示
            Form2 f2 = new Form2(this);
            foreach (Form F in Flist)//先遍历集合,看里面是否有窗体和Form2窗体一样的内容
            {
                if (F.Name == f2.Name)//若果有匹配内容
                {
                    has = true;
                    F.WindowState = FormWindowState.Normal;//先将WindowState属性设置为:Normal
                    F.Focus();//焦点进入
                }
            }
            if (has)//如果has是true
            {
                f2.Close();//把新创建的窗体释放掉

            }
            else//如果has不是true
            {
                Flist.Add(f2);
                f2.Show();
            }

        }

3、窗体之间的传值和控制

传值:构造函数传值

Form1:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 窗体之间的传值和控制
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //判断用户名输入是否正确
            if (textBox1.Text == "zhangsan" && textBox2.Text == "1234")
            {
                Form2 f2 = new Form2(this,textBox1.Text);
                f2.Show();
                this.Hide();
            }
        }
    }
}

Form2:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 窗体之间的传值和控制
{
    public partial class Form2 : Form
    {
        Form1 F1 = null;//全局变量
        //构造函数重载一下,调用这个构造函数时,传过来一个Form1对象,和string Uname
        public Form2(Form1 f1,string Uname)
        {
            InitializeComponent();

            F1 = f1;
            label1.Text = "欢迎回来!" + Uname;

        }
    }
}

控制:第一步,找到窗体对象,

第二步,将窗体对象的控件值更改
注意:要将窗体中的对象访问权限修改

Form1.Designer:

        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.TextBox textBox2;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Label label2;
        public System.Windows.Forms.Button button1;

Form2:

 private void button1_Click(object sender, EventArgs e)
        {
            //把textBox1的值取出来  textBox1.Text;
            if (F1 != null)
            {
                //把Form1.Designer里面button1的private改成public,这样F1就能点出来button1了
                F1.button1.Text = textBox1.Text;
            }
        }

4、提示框类型的窗体

ShowDialog();

作用:当前窗体可进行操作,其他窗体也不能操作

关闭当前窗体,才能操作其他窗体

Form1:

 private void button2_Click(object sender, EventArgs e)
        {
            Form2 f2=new Form2 (this,"111");
            f2.ShowDialog();
        }
时间: 2024-10-05 09:30:00

WinForm 多窗体的相关文章

C# WinForm 父窗体 子窗体 传值

C# WinForm 父窗体 子窗体 传值 本次示例效果如下:Form1为父窗体(包含textBox1.button1)Form2为子窗体(包含textBox2.button2) 父窗体给子窗体传值==================1.点击Form1的button1 打开Form2  父窗体给子窗体传值 可以调用重载子窗体的构造函数 直接传入相关数值 public partial class Form1 : Form    {        public Form1()        {   

Winform跨窗体操作控件(使用委托)

Winform跨窗体操作控件是winform开发中很常见的形式,最常见且简单有效的方式便是使用委托的方式来进行操作,下面我将通过一个小实例来说明如何使用委托跨窗体实现控件操作. 实例介绍:两个窗体,Form1按钮打开Form2,然后在Form2的TextBox输入值在Form1的TextBox中显示出来. 一.项目结构 Form1窗体设计: Form2窗体设计: 二.代码实现 在Form2的代码中声明一个委托(写在Form2类外)-> public delegate void ChangeFor

winform 常用窗体属性

WinForm常用窗体属性: Form常用属性 AutoSizeMode属性 :值是: GrowAndShrink不能调整窗体大小 :值是:GrowOnly 可以改变大小 (1)Name属性:用来获取或设置窗体的名称. (2)WindowState属性:用来获取或设置窗体的窗口状态. (3)StartPosition属性:用来获取或设置运行时窗体的起始位置. (4)Text属性:该属性是一个字符串属性,用来设置或返回在窗口标题栏中显示的文字. (5)Width属性:用来获取或设置窗体的宽度. (

winform 的窗体美化的心酸

其实一直都很懒,很想做点什么.有时会为自己的一个目标狂热,但经常发觉激情过后更多的总是为自己找借口! 我想做一位狂热的程序猿粪子! 最近感觉奔三将近.逐有感而发,不能再这样下去了. 即拿出以前自己为那狂热好一阵的东西续断下去. 一直想为自己开发一套控件库,但感觉精力确实有限,也没那么多时间,逐当初就停止了这种热情. 这是套窗体皮肤,断断续续所花费的时间也不少. 下面我介绍下我的这套皮肤,其实也算不上一套,只算是个开始吧. 有人可能会想这不就是边框隐藏再绘制客户区么,这是目前大部人会选择的方案.但

WinForm开发,窗体显示和窗体传值相关知识总结

以前对WinForm窗体显示和窗体间传值了解不是很清楚最近做了一些WinForm开发,把用到的相关知识整理如下 A.WinForm中窗体显示显示窗体可以有以下2种方法:Form.ShowDialog方法 (窗体显示为模式窗体)Form.Show方法 (窗体显示为无模式窗体) 2者具体区别如下:1.在调用Form.Show方法后,Show方法后面的代码会立即执行2.在调用Form.ShowDialog方法后,直到关闭对话框后,才执行此方法后面的代码3.当窗体显示为模式窗体时,单击"关闭"

WinForm自定义窗体

public partial class Form3 : Form { const int WM_NCHITTEST = 0x0084; const int HT_LEFT = 10; const int HT_RIGHT = 11; const int HT_TOP = 12; const int HT_TOPLEFT = 13; const int HT_TOPRIGHT = 14; const int HT_BOTTOM = 15; const int HT_BOTTOMLEFT = 16

Winform子窗体刷新父窗体

调用窗体(父):Form1,被调用窗体(子):Form2方法1:   所有权法//Form1://需要有一个公共的刷新方法public   void   Refresh_Method(){//...}//在调用Form2时,要把Form2的所有者设为Form1Form2   f2   =   new   Form2()   ;f2.Owner   =   this;f2.ShowDialog()   ;//Form2://在需要对其调用者(父)刷新时Form1   f1   ;f1   =  

WinForm 子窗体在父窗体范围内移动,不能出父窗体 摘自于网络

详细解释:1, 主窗体Form1属性IsMdiContainer设为True,并添加ToolStrip控件, Toolstrip中添加一个按钮toolStripButton1.         2,添加新窗体Form2.           3,主窗体Form1中toolStripButton1的Click事件           private void toolStripButton1_Click(object sender, EventArgs e)         {          

WinForm 设置窗体启动位置在活动屏幕右下角

WinForm 设置窗体启动位置在活动屏幕右下角 在多屏幕环境下, 默认使用鼠标所在的屏幕 1. 设置窗体的 StartPosition 为 FormStartPosition.Manual. 2. 获取鼠标所在屏幕: var screen = Screen.FromPoint(new Point(Cursor.Position.X, Cursor.Position.Y)); 3. 计算并设置窗体位置坐标: var x = screen.WorkingArea.X + screen.Workin

WinForm 多窗体、菜单和工具栏

今天,我首先先学习了一下在WinForm程序开发中常遇到的问题——多窗体程序运行问题. 在开发多窗体程序时,常会遇到以下四个方面的问题: 一.哪个是主窗体 问题:主窗体隐藏了,关闭其它窗体后,没有将主窗体显示/关闭,那么程序就关不上了. 当遇到这个问题时,我们通常的解决办法是:构造函数传值,将窗体传到另一个窗体中去,进行关闭. 二.窗体只能打开一个 创建一个全局的泛型集合,为了放置全部打开的窗体.在窗体打开之前,判断集合中是否有name一致的窗体,如果有就说明已经打开了,就不要再打开了. 问题: