多窗体:
一、首先要想到的问题是:
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 == "")
{
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,"");
f2.ShowDialog();
}

WinForm 多窗体的更多相关文章

  1. Winform子窗体刷新父窗体

    调用窗体(父):Form1,被调用窗体(子):Form2方法1:   所有权法//Form1://需要有一个公共的刷新方法public   void   Refresh_Method(){//...} ...

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

    Winform跨窗体操作控件是winform开发中很常见的形式,最常见且简单有效的方式便是使用委托的方式来进行操作,下面我将通过一个小实例来说明如何使用委托跨窗体实现控件操作. 实例介绍:两个窗体,F ...

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

    WinForm 设置窗体启动位置在活动屏幕右下角 在多屏幕环境下, 默认使用鼠标所在的屏幕 1. 设置窗体的 StartPosition 为 FormStartPosition.Manual. 2. ...

  4. WinForm之窗体应用程序

    WinForm之窗体应用程序 基本简单数据库操作(增删改查) using System; using System.Collections.Generic; using System.Windows. ...

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

    主窗体中代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void b ...

  6. C# winform中 窗体缩放自适应的方法(不同电脑/不同分辨率)

    C# winform中 窗体缩放自适应的方法(不同电脑/不同分辨率)   窗体缩放是一个困扰我多时的问题,为了解决这个问题,我从网上找了很多相关的资料,很多人说用Anchor和Dock属性,但是我试了 ...

  7. winform圆角窗体实现

    winform圆角窗体实现 1.窗体的FormBorderStyle设置成None,不要控制边框 2.TransparencyKey和BackColor颜色设置成相同的,这样,窗体就透明了 3.以此为 ...

  8. C# WinForm 父窗体 子窗体 传值

    C# WinForm 父窗体 子窗体 传值 本次示例效果如下:Form1为父窗体(包含textBox1.button1)Form2为子窗体(包含textBox2.button2) 父窗体给子窗体传值= ...

  9. c#winform自定义窗体,重绘标题栏,自定义控件学习

    c#winform自定义窗体,重绘标题栏 虽然现在都在说winform窗体太丑了,但是我也能尽量让桌面应用程序漂亮那么一点点话不多说,先上图 重绘标题栏先将原生窗体设置成无边框,FormBoderSt ...

  10. winform基础窗体设置及基础控件

    WinForm - 也叫做C/S  客户端 另:B/S是 网页端 客户端应用程序 - 是需要安装在用户电脑上才可以使用的程序 特点: 不需要联网也可以打开使用部分功能,但是现在的情况是许多功能依然需要 ...

随机推荐

  1. set、def、lambda、内置函数、文件操作

    set : 无序,不重复,可以嵌套 .add (添加元素) .update(接收可迭代对象)---等于批量 添加 .diffrents()两个集合不同差 .sysmmetric difference( ...

  2. eclipse下项目死活不编译

    工作中我们可能会遇到这种问题,项目在Eclipse下就是不编译,无论项目clean,重新build项目,重启eclipse,重启电脑都不好使.... 这时候我们可以把项目的jdk删掉,重新add一下, ...

  3. linux文件基本属性

    在Linux中第一个字符代表这个文件是目录.文件或链接文件等等. 当为[ d ]则是目录 当为[ - ]则是文件: 若是[ l ]则表示为链接文档(link file): 若是[ b ]则表示为装置文 ...

  4. Mac 快捷键

    总结一下: Ctrl + 关机:弹出关机提示 Ctrl + Opt + 关机 : 正常关机快捷键 Cmd + Opt + 关机 :休眠 Ctrl + Cmd + 关机:重启 Shift + Ctrl ...

  5. poj2485 kruskal与prim

    Kruskal: #include<iostream> #include<cstdio> #include<algorithm> using namespace s ...

  6. 某预约系统分析 > 某区公共自行车租车卡在线预约,关于如何提高成功概率

    概诉 网上提交预约申请单,线下面交完成实体卡的交付和办理. 本文主要从技术角度分析预约页面,仅供初学者技术交流使用. 表单输入和校验 系统通过2步的确认点击到达信息输入页面. 地址:/bjggzxc/ ...

  7. [QT学习]拷贝文件

    sourceDir源绝对路径,toDir目标绝对路径 //拷贝文件: bool FileOperation::copyFileToPath(QString sourceDir ,QString toD ...

  8. TCP/IP详解学习笔记

    TCP/IP详解学习笔记(1)-基本概念 TCP/IP详解学习笔记(2)-数据链路层 TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议 TCP/IP详解学习笔记(4)-ICMP协议, ...

  9. \r与\n的区别

    \r : return 到当前行的最左边. \n: newline 向下移动一行,并不移动左右. Linux中\n表示回车+换行: Windows中\r\n表示回车+换行. Mac中\r表示回车+换行 ...

  10. 双模蓝牙CC2564调试笔记

    1.CC256X Testing Guide  官方文档WIKI地址:http://processors.wiki.ti.com/index.php/CC256x_Testing_Guide#Devi ...