(一)标签页

先看看效果:

代码:

     public partial class 标签页 : Form
{
string s = "";
public 标签页()
{
InitializeComponent();
}
/// <summary>
/// 判断选项卡中是否有本选项卡
/// </summary>
/// <param name="s">选项卡名</param>
/// <returns>布尔型</returns> private bool HasTablePages(string s)
{
for (int i = ; i < tabControl1.TabPages.Count; i++)
{
if (tabControl1.TabPages[i].Text == s)
{
tabControl1.SelectedIndex = i;//如果选项卡中有本选项卡,则把本选项卡设为焦点
return false;
}
}
return true;
}
/// <summary>
/// 点击菜单时,创建本选项卡,同时将自定义的选项卡控件添加进去
/// </summary>
/// <param name="s">选项卡名</param>
/// <param name="uc">自定义的控件</param>
private void MenuAdd(string s,UserControl uc)
{
if (HasTablePages(s))
{
TabPage page = new TabPage();
page.Text = s; page.Controls.Clear();
page.Controls.Add(uc);
uc.Dock = DockStyle.Fill; tabControl1.TabPages.Add(page);
tabControl1.SelectedTab = page;
}
}
private void 会员管理ToolStripMenuItem_Click(object sender, EventArgs e)
{
s = "会员管理";
UC_HuiYuan uc = new UC_HuiYuan();
MenuAdd(s,uc);
} private void 数据管理ToolStripMenuItem_Click(object sender, EventArgs e)
{
s = "数据管理";
UC_ShuJu sj = new UC_ShuJu();
MenuAdd(s,sj);
} private void 客房管理ToolStripMenuItem_Click(object sender, EventArgs e)
{
s = "客房管理";
UC_KeFang kf = new UC_KeFang();
MenuAdd(s,kf);
}
/// <summary>
/// 双击选项卡名时,关闭本选项卡
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tabControl1_DoubleClick(object sender, EventArgs e)
{
tabControl1.TabPages.RemoveAt(tabControl1.SelectedIndex);
}
}

(二)子窗体

先看看效果:

代码:

     public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 关闭所有窗口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 关闭所有窗口ToolStripMenuItem_Click(object sender, EventArgs e)
{
while (this.MdiChildren.Length > )
{
MdiChildren[].Close();
}
}
/// <summary>
/// 新建Form2
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
bool b = true;//用来判断子窗口中是否存在Form2
for (int i = ; i < this.MdiChildren.Length; i++)
{
if (this.MdiChildren[i].Name == "Form2")
{
b = false;
}
}
//没有子窗口 或者 子窗口中没有Form2 时
if (this.MdiChildren.Length == || b)
{
Form2 fm = new Form2();
fm.MdiParent = this;
fm.Show();
}
}
/// <summary>
/// 新建Form3
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
bool b = true;
for (int i = ; i < this.MdiChildren.Length; i++)
{
if (this.MdiChildren[i].Name == "Form3")
{
b = false;
}
}
if (this.MdiChildren.Length == ||b)
{
Form3 fm = new Form3();
fm.MdiParent = this;
fm.Show();
}
}
}

PS:

1.父窗体:IsMdiContainer=true
2.子窗体:建一个窗体,设计好。在父窗体“新建子窗体”界面中,把子窗体new出来。把新new出来的子窗体的MdiParent属性设置为父窗体对象。

20141112 WinForm子窗口标签页的更多相关文章

  1. Google 浏览器设置打开超链接到新窗口标签页

    一.windows  按住Ctrl + 鼠标点击,在新窗口打开,停留在当前页面: 按住Ctrl + Shift + 鼠标点击,在新窗口打开,停留在新窗口: 登录Google账号,管理Google账号, ...

  2. winform子窗口调用父窗口的控件及方法-一般调用

    首先新建一个窗体应用程序,在项目属性中点击右键->添加->添加新项,选择Windows窗体->添加. 在Form1和Form2窗口中各添加一个按钮,并双击添加事件处理函数:     ...

  3. winform子窗口与父窗口的交互-使用委托与事件

    实现子窗口与父窗口的交互,通过父窗口调用并控制子窗口,子窗口也能控制父窗口,使用委托和事件的方法,可以实现. 1.父窗口调用子窗口,并通过子窗口控制父窗口 新建工程,创建两个窗体    显示子窗体的代 ...

  4. 创建带标签页的MDI WinForms应用程序

    http://www.cnblogs.com/island/archive/2008/12/02/mditab.html 创建MDI应用程序 先创建”Windows窗体应用程序”解决方案Tabable ...

  5. 项目总结03:window.open()方法用于子窗口数据回调至父窗口,即子窗口操作父窗口

    window.open()方法用于子窗口数据回调至父窗口,即子窗口操作父窗口 项目中经常遇到一个业务逻辑:在A窗口中打开B窗口,在B窗口中操作完以后关闭B窗口,同时自动刷新A窗口(或局部更新A窗口)( ...

  6. dedecms列表页调用子栏目列表,织梦首页调用栏目的子栏目标签代码

    dedecms列表页调用子栏目列表,织梦首页调用栏目的子栏目标签代码. dedecms列表页调用子栏目列表标签: {dede:channelartlist type='sun' }<a href ...

  7. 4. VIM 系列 - 认识VIM的缓冲区、窗口、标签页

    目录 1. 缓冲区 2. 窗口 3. 标签页 4. 设置一下热键 1. 缓冲区 文件和缓冲区的区别 vim 打开一个文件时,其实是从磁盘中读取文件到内存中,vim的一些操作其实是在操作缓冲区, 当使用 ...

  8. window.open新打开窗口与新开标签页

    最近在使用window.open时忽略了一个细节问题:window.open新打开一个窗口,但是有时却是新打开一个窗口有时打开一个新标签页.虽然对一般的需求来说,这个两种情况都无所谓,但是对于那种有强 ...

  9. 【vim】分割窗口、标签页与Quickfix窗口

    vim支持窗口分割和标签页,合适地使用这两种特性可以使文字编辑工作更愉快. 1. 窗口分割 vim支持窗口的水平分割和垂直分割.以下是常用的操作指令或快捷键. 命令 说明 vim -o <fil ...

随机推荐

  1. poj 1940 Wine Trading in Gergovia_贪心

    在一条街上有许多房屋,每间屋子里都住着人,并且都是做葡萄酒生意的商人,他们每天都要决定买卖多少瓶葡萄酒.有趣的地方是,供需总是完美地一致.商人总是能买到自己需要的葡萄酒,并且,他们从来不介意是从哪个商 ...

  2. windows Oracle DBases auto backUp

  3. Codeforces Round #245 (Div. 1)——Working out

    题目链接 题意: 一个n*m的矩阵,每一个方格有一个非负数,如今选择两条线路:一个左上到右下,一个左下到右上,且仅仅能有一个公共点. 求两个线路上数的最大值(公共点不算) 分析: 仅仅有两种情况,dp ...

  4. C#整理6——数组的应用

    数组的应用:(一).冒泡排序.1.冒泡排序是用双层循环解决.外层循环的是趟数,里层循环的是次数.2.趟数=n-1:次数=n-趟数.3.里层循环使用if比较相临的两个数的大小,进行数值交换. 作业:1. ...

  5. javascript模式——Factory

    Facotry模式是一种创建型模式,他不同于一般编码习惯,显示的调用各个构造函数.Factory模式是提供一个通用的接口来创建对象. 一个Factory模式压缩所有对象创建的方式,降低这个工厂与其它对 ...

  6. base64图片在各种浏览器的兼容性处理

    IE浏览器目前最高的版本是v11,而微软放弃了IE,转向新的浏览器开发,并取名为Edge.base64图片在IE9及以后的图片均能显示没有问题,而Firefox, Chrome, Safari等非IE ...

  7. asp.net cookie的使用.

    Cookie就是服务器暂时存放在你的电脑里的资料(.txt格式的文本文件),好让服务器用来辨认你的计算机.当你在浏览网站的时候,Web服务器会先送一小小资料放在你的计算机上,Cookies 会帮你在网 ...

  8. SQL Server 已提交读快照 测试

    1. 打开数据库 已提交读快照 选项 2. 数据库 已提交读快照 模式下的测试 a) 测试表 Test b) 开启事务1,更新数据C2 = '200'(未提交) BEGIN TRAN ' WHERE ...

  9. JavaScript Dispatch Event

    <html> <head> <script type="text/javascript"> function performClick(elem ...

  10. Spring配置多数据源

    如何在应用启动之后灵活切换数据源的关键点: 将SessionFactory接口中的dataSource配置为AbstractRoutingDataSource的instance,sessionFact ...