由于公司的业务调整,最近不仅开发bs,还有不熟悉的cs,人手也不足,项目还多,对于cs来说,算是小白,虽然是一个人,也是硬着头皮写,拖拽控件,自定义控件。一个项目下来,对cs有了很深的认识,这里好好感谢下老大以及身边的同事,总是在我绞尽脑汁也没想出好的解决方案时来给我指点迷津。

首先介绍下cs的页签功能,毕竟之前学校那会,仅仅是简单的弹出新窗体,关闭就窗体。对于项目中是菜单而言,肯定是要有子界面相互切换的功能,关于这一块,其实就是在主窗体中画一个Pannel(其他的listbox也可以),按钮点到哪里就把对应的子窗体加载到主窗体上的pannel(listbox)中即可,当然子窗体可以选择新建窗体、新建用户控件,如果选择新窗体,需要将FormBorderStyle的属性值设为None,来去掉窗体四周多余的料。操作如下图,设置了两个窗体,一个用户控件。分别命名为form01、form002、form003Con

(注: 初始化的时候执行子窗体的构造函数,Show之后执行Load 函数)

        private form001 f1;
private form002 f2;
private form003Con f3; private void Main_Load(object sender, EventArgs e)
{
f1 = new form001();
f2 = new form002();
f3 = new form003Con();
}
private void btn_001_Click(object sender, EventArgs e)
{
//设置子窗体非顶级窗体
f1.TopLevel = false;
panel2.Controls.Clear();
panel2.Controls.Add(f1);
//显示子窗体
f1.Show();
}
private void btn_002_Click(object sender, EventArgs e)
{
f2.TopLevel = false;
panel2.Controls.Clear();
panel2.Controls.Add(f2);
//设置子窗体铺满父窗体(跟随父窗体变化而变化)
f2.Dock = DockStyle.Fill;
f2.Show(); }
private void btn_003_Click(object sender, EventArgs e)
{
//用户控件: 不需要设置层级、调用show方法,本身就是控件
panel2.Controls.Clear();
panel2.Controls.Add(f3); f3.Dock = DockStyle.Fill;
}

根据以上操作,窗体在放大的时候,子窗体 f1保持初始化大小,而子窗体 f2、f3随随着主窗体变大而跟着变大。效果图如下

做到这里效果是能达到了,但是会有一个问题,就是对控件事件的控制,比如子窗体1,2,3 中分别有一个按钮控件,这些按钮按下去要获得主窗体的一些参数信息,常规方法是在子窗体后台的构造函数中加入参数,然后父窗体New 子窗体对象的时候传递值进去。这种实现方法没问题,但是有时候会遇到这种情况,父窗体需要子窗体的某些控件信息,拿到这些信息后要在父窗体中进一步处理后显示。这种时候的处理其实是将子窗体中按钮的触发事件加载到父窗体中来实现。代码如下

private void btn_002_Click(object sender, EventArgs e)
{
f2.TopLevel = false;
panel2.Controls.Clear();
panel2.Controls.Add(f2);
//重置子窗体的按钮点击事件 到 f2btnQuery方法中
f2.btnQuery.Click += new System.EventHandler(f2btnQuery);
            //设置子窗体铺满父窗体(跟随父窗体变化而变化)           
f2.Dock = DockStyle.Fill;
f2.Show();
}
private void f2btnQuery(object sender, EventArgs e)
{
//将子窗体2中待编辑控件的Modifiers 属性设置为 Public
f2.label1.Text = "";
f2.label2.Text = "";
var value = f2.textBox1.Text.Trim();
}

此外,winform程序运行在不同分辨率的电脑上,为了兼容,基本都是要做窗体自适应功能。之前在网上寻找了很多例子,有的是对 Dock和 Anchor 两个属性进行操作,针对面板来说还凑合,但是对于里面的textbox等小控件来说在实际上单靠这两个完全行不通。有的文章来计算一下针对一些界面简单的小Demo,看着还行,但是在实际项目的开发中,则完全不行。有的文章则是通过计算控件的宽高来达到等比缩放的比例,对于简单的窗体还好,但是对拥有各种复杂嵌套的窗体来说,就显得有些捉襟见肘。实际项目中可以直接通过画表格来达到缩放效果。工具箱列表中有一个TableLayoutPanel 控件,就是用来制作表格的。在窗体上拖一个该控件,设置Dock为Fill 铺满,然后将窗体的控件填充到表格中,如果是Label 可以直接拖入,如果是其他button、textbox之类的,建议先拖一个pannel 来作为底,再在pannel上放入button、textbox等控件。当然并不是每个控件都会只占一个单元格,这就涉及到行合并,列合并。对于TableLayoutPanel 控件本身,并没有像Excle表格那样提供该属性。但是也并非没有解决方案,比如先拖动一个pannel 在一单元格上,设置ColumnSpan(跨行)、RowSpan(跨列),拖动 pannel 合并对应的行列铺满(Dock 为Fill ),在将其他控件放置在pannel上即可。如下:

  

当然这是对于简单的界面,而对于那些拥有复杂控件的窗体来说,操作也很简单,只需要稍稍加一个占比即可。这里做了一个测试窗体,如下

如上图所示,不难看出这是由 4个TableLayoutPanel 所组合的窗体,首先是一个大表格,一行三列,分别为分类一,分类二,分类三,然后在该三列下分别有一个三行一列的TableLayoutPanel  控件。对于缩放而言点击右上角设置列和行的占比,还能和固定长度进行混合设置,我这里设置的三列占比 23%、50%、27%,每列中最上面一行设置固定长度26,剩下的行凑足100%,下面我们来最大化一下和上图初始化的窗体比较一下效果

效果还行,基本是按照自己把控的尺寸变化。当然每个列中还会放置很多文本框、标签、下拉列表等等的控件,如果实在是很多,建议再在某个单元格中嵌套一个 TableLayoutPanel 控件,再次进行拆分,pannel进行填充跨行列,而对于这些控件,如果同样希望等比例缩放,则设置Anchor 上下左右全选即可。如此以来,变可以彻彻底底的解决winform 窗体的自适应困局。

由于本人在CS开发方面还属于小白水平,独立开发项目时在功能完成的情况下对这些界面布局设置上面走了很多弯路,这里记录一下,毕竟作为空巢老人,指不定明天就忘记了,如果能对其他人有丁点的帮助,那便甚是欣慰。

Winfon 页签切换及窗体控件自适应的更多相关文章

  1. 1、CRM2011编程实战——清空指定页签以下的全部选项,并对页签以下的指定控件进行操作

    需求:当页面载入时,"呼叫编号"保持不变,"任务号"自己主动更新."接报时间"和"发生日期"自己主动设置为当天日期和时间 ...

  2. Winform窗体控件自适应大小

    自己写的winform窗体自适应大小代码,代码比较独立,很适合贴来贴去不会对原有程序造成影响,可以直接继承此类或者把代码复制到自己的代码里面直接使用 借鉴了网上的一些资料,最后采用重写WndProc方 ...

  3. 041. asp.net中内容页访问母版页中的控件

    母版页运行机制: 用户通过输入内容也的URL来请求某个页面, 获取该页面后, 读取@Page指令, 如果该指令引用了一个母版页, 则也读取该母版页, 如果也是第一次请求这两个页面, 则母版页和被请求的 ...

  4. Qt编写自定义控件48-面板窗体控件

    一.前言 很多时候需要有一个控件,能够替代容器控件,自动容纳多个widget,自适应宽高,然后提供滚动条功能,这就必然需要用到QScrollArea控件,可设置各个子面板的间距等,也在很多系统中用到, ...

  5. C# winform 跨线程更改窗体控件的属性

    当winform程序中新开一个线程,是无法改变主线程中窗体控件的属性的,否则运行时会报错. 若想在其他线程中控制主线程中的窗体控件,则必须利用BeginInvoke方法. 例如:添加一个名为textb ...

  6. winform窗体控件(全)

    回顾跟补充下除了昨天那常用6个其他的winform窗体控件作用 1:Button:按钮 (1)AutoSize:如果是True的情况下,内容将会撑开:False的话会另起一行 (2)Enabled: ...

  7. (转)sl简单自定义win窗体控件

    sl简单自定义win窗体控件      相信大家接触过不少win窗体控件ChildWin子窗口就的sl自带的一个  而且网上也有很多类似的控件,而今天我和大家分享下自己制作个win窗体控件,希望对初学 ...

  8. 如何:对 Windows 窗体控件进行线程安全调用

    http://msdn.microsoft.com/zh-cn/library/ms171728(VS.90).aspx http://msdn.microsoft.com/zh-cn/library ...

  9. C# 静态函数调用窗体控件

    回调函数方法是静态函数,需要调用窗体控件,赋值或取值. 定义 public static Form1 mainFrm;   mainFrm = this; public partial class F ...

随机推荐

  1. Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题

      (转载)Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题   这几天在用spring boot开发项目, 在开发的过程中遇到一个问题hibernate在执 ...

  2. MAC下 mySQL及workbench安装

    1.首先去mysql 网站下载安装包,https://dev.mysql.com/downloads/mysql/ 选择第一个.dmg格式的下载安装 2.安装完成后,在System Preferenc ...

  3. Java课程课后作业190309之连续最大子数组

    老师在课堂是提出了这个问题,并且提出了时间复杂度是O(n)的要求,一开始我自己思想简单,在逻辑上出现了十分粗心的错误,后来同学们也在课堂上比较激烈地讨论了一番,也只是将时间复杂度降到了O(n*n),在 ...

  4. nodejs----安装配置

    Node.js 安装配置 Node.js 安装包及源码下载地址为:https://nodejs.org/en/download/. 你可以根据不同平台系统选择你需要的 Node.js 安装包. Nod ...

  5. PHP算法学习(2) 轮训加权算法

    2019年1月8日16:10:51 svn地址:svn://gitee.com/zxadmin/live_z    代码在code里面 <?php /* * 加权轮训算法 * * * $arr ...

  6. Linux系统的命令应该如何记?

    Linux入门篇: 很多刚入门的同学,就像无头的苍蝇一样,到处找视频.书籍.网站帖子之类的学习方式,视频虽然讲得详细,但是时间的投入也是巨大的,播放时间,练习时间,加起来很吓人,其实啊很少有人能坚持把 ...

  7. [02-01]Java学习路线(完整详细版)

    Java基础课程 Java基础课程内容涉及:Java开发介绍.Java数组.Java面向对象.常用基础类.集合.IO流.多线程.异常.网络.反射. 第一阶段:Java基础 1 第一部分:Java开发介 ...

  8. bios下能看到硬盘,进入系统看不到的解决方法

    新加了个固态硬盘 安装完系统后,打开我的电脑 看不到老硬盘的分区,进入磁盘管理也看不到. 最后,重启 选择老硬盘进入系统后, 再重启,进入新硬盘的系统, 就显示出来了

  9. vue深度监控数据改变,缓存数据到本地

    项目效果图: var vm = new Vue({ el:'#app', data:{ students:[], }, watch:{ students:{ handler(){ localStora ...

  10. Maven -- 在进行war打包时排除不需要的文件

    https://blog.csdn.net/zsg88/article/details/78128603 <excludes> <!-- 排除文件,不包含子目录,对WEB-INF目录 ...