8.4 容器2
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的
8.4.3 TabControl(选项卡)控件
TabControl控件可以通过设置多个选项卡页(TabPage控件)把不同的控件显示到不同的页面,每个选项卡页都相当于一个容器,可以向里面添加其它控件,但同一时刻只能显示其中一个选项卡页。
TabControl控件比较常见,比如windows系统下的文件夹选项,将常规、查看、搜索对应的设置划分到了不同的功能区域:
图8-87 【文件夹选项】窗口提供了三个选项卡将功能进行分组
TabControl分为上下两部分,默认情况下,上部分包含了2个选项卡按钮,下面是TabPage,点击选项卡按钮,下面部分即可切换到对应的TabPage显示。鼠标单击上部分的选项卡按钮或是空白部分,编辑器右侧的【属性】窗口即刻切换到TabControl属性;鼠标单击TabPage部分,编辑器右侧的【属性】窗口即刻切换到相应的TabPage属性。
图8-88 此时选中的是TabPage2
TabControl常用属性:
- Appearance:选项卡的可视外观。
- Alignment:选项卡按钮显示位置(顶部、底部、左侧、右侧)。
- SizeMode:调整控件的选项卡大小的样式。
- Multiline:是否多行显示。
- SelectedIndex:当前所选择的选项卡页的索引。
- SelectedTab:当前所选择的选项卡页,返回TabPage类型。
- TabPages:包含选项卡页的集合。通过按下TabPages属性后面的按钮打开【TabPage集合编辑器】来添加、删除、编辑。也可以右击选项卡控件上部分的选项看按钮,在弹出菜单中选择“添加选项卡”或“移除选项卡”进行添加默认属性的选项卡页或删除选中的选项卡页,但是没有编辑功能。
TabControl常用事件:
- SelectedIndexChanged:当前所选择的选项卡页索引发生改变时触发。
注意:TabControl控件有对应的事件,不同的TabPage也有各自的事件。
【例 8.53】【项目:code8-053】选项卡页的增加、删除、清除和切换。
在窗体上放置四个Button控件和一个TabControl控件,并将TabControl上的选项卡页全部删除。
//增加选项卡页
private void button1_Click(object sender, EventArgs e)
{
//实例化一个选项卡页
TabPage newTabPage = new TabPage();
//显示名称
newTabPage.Text = "测试";
//放置一个标签到选项卡页上
Label tpLabel = new Label();
tpLabel.Text = "新建于" + DateTime.Now.ToLongTimeString();
tpLabel.Location = new Point(20, 50);
newTabPage.Controls.Add(tpLabel);
//将新建的选项卡也加入到选项卡控件上
tabControl1.TabPages.Add(newTabPage);
}
//删除选项卡页
private void button2_Click(object sender, EventArgs e)
{
//当选中的选项卡页索引号大于-1时才执行删除
if (tabControl1.SelectedIndex > -1)
//使用RemoveAt(索引号)进行删除
tabControl1.TabPages.RemoveAt(tabControl1.SelectedIndex);
}
//清除选项卡页
private void button3_Click(object sender, EventArgs e)
{
tabControl1.TabPages.Clear();
}
//选项卡页按顺序切换
private void button4_Click(object sender, EventArgs e)
{
//选中的选项卡页索引号
int tabPos = tabControl1.SelectedIndex;
//总的选项卡页数量
int tabCount = tabControl1.TabPages.Count;
//当下一个选项卡页索引号小于选项卡页总数时,选中下一个选项卡页
//否则选中第一个(索引号等于0)选项卡页
if (tabPos + 1 < tabCount)
tabControl1.SelectedIndex = tabPos + 1;
else if(tabPos + 1 == tabCount)
tabControl1.SelectedIndex = 0;
}
运行结果如下图所示:
图8-89 TabControl增加、删除选项卡页
8.4.4 SplitContainer(拆分容器)控件
SplitContainer控件是由一个可移动的拆分条及其分隔开的两个面板构成。当光标在拆分条上时,光标形状将变为水平调整大小形状或垂直调整大小形状,此时按下鼠标左键不放,可以拖动拆分条重新设置两部分面板的大小。
SplitContainer控件类似于系统资源管理器左侧的树视图、拆分条、右侧的文件夹两部分。
窗体编辑模式下,向窗体上添加一个SplitContainer,其Dock属性默认为Fill,将整个窗体分为两个面板(Panel),默认名称为Panel1和Panel2。在这两个Panel上都可以放置需要的控件,甚至在这两个面板还可以放置SplitContainer,将容器拆分为更多的面板:
图8-90 在左右拆分的基础上将右侧面板上下拆分
SplitContainer主要属性:
- IsSplitterFixed:指示拆分条是固定的还是可移动的。固定为True,可移动为False,默认值为False。
- Orientation:指示是水平方向还是垂直方向进行拆分。
- SplitterWidth:拆分条的宽度,默认为4像素。
- SplitterIncrement:拆分条移动的增量。
- SplitterDistance:拆分条初始时离SplitContainer的左边缘或上边缘的位置。
- Panel1:表示左侧面板(左右拆分时)或上部面板(上下拆分时)。在SplitContainer的【属性】窗口内,可以单击Panel1属性前面的+,展开该面板的更多属性。或者直接在窗体上直接单击Panel1,右侧【属性】窗口显示该面板的属性。
- Panel1Collapsed:确定 Panel1 是折叠是折叠的还是展开的。
- Panel1MinSize:Panel1的最小宽度或高度。
- Panel2:表示右侧面板(左右拆分时)或下部面板(上下拆分时)。在SplitContainer的【属性】窗口内,可以单击Panel2属性前面的+,展开该面板的更多属性。或者直接在窗体上直接单击Panel2,右侧【属性】窗口显示该面板的属性。
- Panel2Collapsed:确定 Panel1 是折叠是折叠的还是展开的。
注意:Panel1Collapsed和Panel2Collapsed不能同时被设置为True。
- Panel2MinSize:Panel2的最小宽度或高度。
注意:Panel1MinSize、Panel2MinSize和SplitterWidth之和不能超过所在SplitContainer的宽度(左右拆分时)或高度(上下拆分时)。
SplitContainer主要事件:
- SplitterMoving:当拖动拆分条移动时触发。由于
- SplitterMoved:当拖动拆分条完毕后触发。
【例 8.54】【项目:code8-054】限制拆分条改变面板大小。
在窗体上放置一个SplitContainer控件,使用默认分隔为左右两个面板,Dock属性为Fill。
方法一:设置IsSplitterFixed属性为True。
方法二:设置Panel1的最小宽度、Panel2的最小宽度与拆分条宽度之和大于或等于SplitContainer的宽度。
private void Form1_Load(object sender, EventArgs e)
{
splitContainer1.Panel1MinSize = 200;
splitContainer1.Panel2MinSize = splitContainer1.Width - splitContainer1.Panel1MinSize - splitContainer1.SplitterWidth;
}
方法三:在SplitterMoving事件中加入如下代码:
private void splitContainer1_SplitterMoving(object sender, SplitterCancelEventArgs e)
{
e.Cancel = true;
}
方法四:设置拖动拆分条位置总是等于初始时的位置。
int sDistance;
private void Form1_Load(object sender, EventArgs e)
{
sDistance = splitContainer1.SplitterDistance;
splitContainer1.SplitterMoved += SplitContainer1_SplitterMoved;
}
private void SplitContainer1_SplitterMoved(object sender, SplitterEventArgs e)
{
splitContainer1.SplitterDistance = sDistance;
}
注意:由于窗体载入时会触发SplitContainer1.SplitterMoved事件,请将该事件加入到窗体载入代码的最后。
学习更多vb.net知识,请参看vb.net 教程 目录
学习更多C#知识,请参看C#教程 目录
相关文章:
8.4 容器2
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 8.4.3 TabControl(选项卡)控件 TabControl控件可以通过设置多个选项卡页(TabPage控件)…...
一组可能的机器学习问题列表
线性回归与多项式拟合的关系最小二乘法在机器学习中的应用梯度下降是如何实现的贝叶斯分类器的应用场景高斯分布与判定在哪里用到模型的评估有哪些参数误差中的偏差和方差定义训练集分组的快捷方式如何度量模型性能查准率查全率的定义roc,aux的含义正则化是什么意思k均值用来解…...
Android 权限列表
权限名称描述android.permission.ACCESS_CHECKIN_PROPERTIES访问登记属性读取或写入登记 check-in 数据库属性表的权限android.permission.ACCESS_COARSE_LOCATION获取粗略位置通过 WiFi 或移动基站的方式获取用户粗略的经纬度信息,定位精度大概误差在 30~1500 米an…...
探索在视频深度伪造中的细微的表情变化或对特定面部特征的小改动检测方法
概述 2019 年,美国众议院议长南希佩洛西成为了一次针对性的、技术含量相对较低的“深度伪造”式攻击的目标。真实的佩洛西视频被编辑,让她看起来像是喝醉了酒。这一不真实的事件在真相大白之前被分享了数百万次,而且在一些人没有关注后续报道…...
调用阿里云API实现身份证文字识别
TOC# 1.作者介绍 姚元帅,男,西安工程大学电子信息学院,2024级研究生 研究方向:机器视觉与人工智能 电子邮件:3183969029qq.com 乔幸荣,女,西安工程大学电子信息学院,2024级研究生&a…...
使用UFW+IPSET禁用海外IP配置持久化操作
上一章我们介绍了如何使用ufwipset禁用海外IP,但是如果服务器重启动,之前的配置就无效了,所以让配置持久化可以避免我们反复设置的麻烦。 IPSET配置持久化的方法有很多种,目前我配置成的是设置ipset后台服务,具体方法…...
深入Linux内核理解socket的本质
本文将从一个初学者的角度开始聊起,让大家了解 Socket 是什么以及它的原理和内核实现。 一、Socket 的概念 Socket 就如同我们日常生活中的插头与插座的连接关系。在网络编程中,Socket 是一种实现网络通信的接口或机制。 想象一下,插头插入…...
Python使用爬虫IP抓取数据过程
用户之前询问了不同语言的爬虫示例,特别是Python、Node.js和Ruby。现在他们希望详细扩展Python版本中使用代理IP的过程。 用户可能已经掌握了基本的爬虫编写,但遇到了IP被封的问题,或者想防止被封。他们需要知道如何集成代理IP到现有的代码中…...
通过MCP+数据库实现AI检索和分析
通过 MCP(Multi-Agent Collaboration Platform,多智能体协作平台) 数据库,实现一个AI检索和分析系统。 一、系统目标 实现通过 AI 多智能体对结构化(数据库)和非结构化(文档、文本)…...
51单片机烧录程序演示教程
51单片机烧录程序演示教程 51单片机是一种经典的8位单片机,广泛应用于嵌入式系统开发中。烧录程序是指将编译好的代码下载到单片机的存储器中,以便单片机能够按照程序运行。以下是详细的烧录流程和步骤。 所需工具和材料 硬件: 51单片机开发…...
06软件测试需求分析案例-添加用户
给职业顾问部的老师添加用户密码后,他们才能登录使用该软件。只有admin账户具有添加用户、修改用户信息、删除用户的权利。admin是经理或团队的第一个人的账号,后面招一个教师就添加一个账号。 通读需求是提取信息,提出问题,输出…...
Asp.NET Core WebApi IOptions<T>详解
IOptions<T> 是 ASP.NET Core 中用于访问配置数据的一个接口,它属于 Microsoft.Extensions.Options 命名空间。通过 IOptions<T>,你可以将配置绑定到强类型的类中,并在应用程序的不同部分中注入和使用这些配置。这种方式不仅使得…...
Gartner发布软件供应链安全市场指南:软件供应链安全工具的8个强制功能、9个通用功能及全球29家供应商
攻击者的目标是由开源和商业软件依赖项、第三方 API 和 DevOps 工具链组成的软件供应链。软件工程领导者可以使用软件供应链安全工具来保护他们的软件免受这些攻击的连锁影响。 主要发现 越来越多的软件工程团队现在负责解决软件供应链安全 (SSCS) 需求。 软件工件、开发人员身…...
(四十三)Dart 中的空安全与 `required` 关键字
Dart 中的空安全与 required 关键字 空安全(Null Safety) 空安全(Null Safety)是 Dart 语言的一项重要特性,旨在帮助开发者避免空指针异常(NullPointerException)。空安全通过在编译时检查变量…...
《解锁分布式软总线:构建智能设备统一管理平台》
智能设备的数量呈爆发式增长,从智能家居里的各类电器,到智能办公中的电脑、打印机,再到工业领域的各种自动化设备,不一而足。如何对这些纷繁复杂的智能设备进行有效管理,成为摆在我们面前的一道难题。分布式软总线技术…...
【android bluetooth 协议分析 01】【HCI 层介绍 1】【hci_packets.pdl 介绍】
在 AOSP 的蓝牙协议栈 (Gabeldorsche) 中,hci_packets.pdl 是一个 协议描述语言文件,用于定义 HCI (Host Controller Interface) 层的数据包结构和通信协议。以下是详细解析: 1. 文件作用 system/gd/hci/hci_packets.pdl 协议自动化生成&…...
远程升级组件设计
----------------------- | 主应用程序 | ---------------------- | 通信接口(使用本地socket通信发送给远程升级模块进程或者线程 | (如何启动进程程execl或execv函数),启动线程用std::sthread。 v ---------------------- 远程升级模块 ----------…...
Kubernetes集群环境搭建与初始化
1.Kubernetes简介: Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。 在Kubernetes中,我…...
Compose 适配 - 响应式排版 自适应布局
一、概念 基于可用空间而非设备类型来设计自适应布局,实现设备无关性和动态适配性,避免硬编码,以不同形态布局更好的展示内容。 二、区分可用空间 WindowSizeClasses 传统根据屏幕大小和方向做适配的方式已不再适用,APP的显示方式…...
5G_WiFi_CE_DFS
目录 一、规范要求 1、法规目录 2、定义 3、运行模式 4、主/从设备相关的运行行为及具体的动态频率选择(DFS)要求 5、产品角色确定测试项目 6、测试项目 测试项1:信道可用性检查(Channel Availability Check) …...
Lalamove基于Flink实时湖仓演进之路
摘要:本文投稿自货拉拉国际化技术部 资深数据仓库工程师林海亮老师。内容分为以下几个部分: 1、业务简介 2、Flink 在业务中的应用与挑战 3、实时数仓架构的 Flink 驱动演进 4、未来展望 一、业务简介 Lalamove 于2013年在香港成立,是货拉拉的…...
【含文档+PPT+源码】基于微信小程序的卫生院预约挂号管理系统的设计与实现
项目视频介绍: 毕业作品基于微信小程序的卫生院预约挂号管理系统的设计与实现 课程简介: 本课程演示的是一款基于微信小程序的卫生院预约挂号管理系统的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习…...
人工智能100问☞第2问:机器学习的核心原理是什么?
目录 一、通俗解释 二、专业解析 三、权威参考 机器学习的核心原理是通过数据训练模型,使计算机自动发现数据中的内在规律或模式,并利用这些规律对新数据做出预测或决策。这一过程强调数据驱动(从经验中学习)、模型优化(通过损失函数和参数调整提升性能)以及泛…...
【深度学习基础】——机器的神经元:感知机
感知机模型的原理之前已经讲过(【感知机模型 - CSDN App】https://blog.csdn.net/2401_88885149/article/details/145563837?sharetypeblog&shareId145563837&sharereferAPP&sharesource2401_88885149&sharefromlink)但主要是从数学和机…...
OpenCV 图形API(29)图像滤波-----GMat类
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::GMat 是 OpenCV 的 G-API 模块中的一个核心类,用于定义计算图中的数据节点。G-API 是 OpenCV 中的一个模块,旨在通过…...
spark的堆外内存,是在jvm内还是操作系统内存内?
在 Apache Spark 中,堆外内存(Off-Heap Memory)是直接分配在操作系统的物理内存中,而非 JVM 堆内内存。以下是详细的解释: 1. 堆外内存的本质 操作系统管理 Spark 的堆外内存直接通过操作系统分配(例如使用…...
AD9253 LVDS 高速ADC驱动开发
1、查阅AD9253器件手册 2、查阅Xilinx xapp524手册 3、该款ADC工作在125Msps下,14bit - 2Lane - 1frame 模式。 对应:data clock时钟为500M DDR mode。data line rate:1Gbps。frame clock:1/4 data clock 具体内容:…...
swift菜鸟教程14(闭包)
一个朴实无华的目录 今日学习内容:1.Swift 闭包1.1闭包定义1.2闭包实例1.3闭包表达式1.3.1sorted 方法:据您提供的用于排序的闭包函数将已知类型数组中的值进行排序。1.3.2参数名称缩写:直接通过$0,$1,$2来顺序调用闭包的参数。1.3.3运算符函…...
【HarmonyOS NEXT+AI】问答02:有一点编程基础,可以学不?
在“HarmonyOS NEXTAI大模型打造智能助手APP(仓颉版)”课程里面,有学员问,有一点编程基础,可以学不? 这里统一做下回复。 学习本课程只需要掌握任一编程语言即可,拥有JavaScript、TypeScript、ArkTS或Java语言基础更佳…...
maven 依赖的优先级
最短路径优先 工程中依赖了a、b两个jar包, 在a jar包内引用了b jar包版本为1.0,路径为:Project > a > b(1.0) 工程中直接依赖的b jar包版本为2.0,路径为:Project > b(2.0) 由于b(2.0)路径最短࿰…...
Java实现音频录音播放机功能
Java实现一个简单的音频录音和播放功能,使用Swing创建图形用户界面,利用Java Sound API进行音频处理。下面是对此程序的详细剖析: 一、程序结构 程序主要由以下几个部分组成: RecorderFrm类:主框架类,继承自…...
OpenCV 图形API(26)图像滤波-----方框滤波函数boxFilter()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 使用方框滤波器模糊图像。 该函数使用以下内核来平滑图像: K α [ 1 1 … 1 1 1 … 1 ⋮ ⋮ ⋱ ⋮ 1 1 … 1 ] K \alpha \begin{b…...
oracle 表空间(Tablespace)
在 Oracle 11g 中,表空间(Tablespace) 是数据库存储架构的核心逻辑单元,其原理基于 逻辑存储与物理存储的分离,通过分层管理数据文件、段(Segment)、区(Extent)和数据块&…...
Git 高级操作
Git不仅是代码管理的基石工具,更是开发者提升效率的瑞士军刀。掌握基础操作只是起点,真正的高手都在使用进阶技巧优化工作流。本文将深入解析Git四大高阶操作,助你轻松应对复杂开发场景! 一、交互式暂存:精准控制提交粒…...
Go:程序结构
文章目录 名称声明变量短变量声明指针new 函数变量的生命周期 赋值多重赋值可赋值性 类型声明包和文件导入包初始化 作用域 名称 命名规则: 通用规则:函数、变量、常量、类型、语句标签和包的名称,开头须是字母(Unicode 字符 &a…...
sqlserver2017 分离附加数据库
分离数据库 分离数据库是指将数据库从 SQL Server 实例中移除,但会完整保留数据库及其数据文件和事务日志文件。 然后可以使用这些文件将数据库附加到任何 SQL Server 实例,包括分离该数据库的服务器。 如果存在下列任何情况,则不能分离数据…...
QuarkPi-CA2 RK3588S卡片电脑:6.0Tops NPU+8K视频编解码+接口丰富,高性能嵌入式开发!
QuarkPi-CA2 RK3588S卡片电脑:6.0Tops NPU8K视频编解码接口丰富,高性能嵌入式开发! 芯片框架 视频介绍 https://www.bilibili.com/video/BV1btdbYkEjY 开发板介绍 核心升级,产品炸裂 QuarkPi-CA2卡片电脑搭载瑞芯微RK3588S芯片…...
对称加密与非对称加密与消息摘要算法保证https的数据交互的完整性和保密性
一、对称加密与非对称加密的作用 1. 对称加密 作用: 保密性:对称加密使用相同的密钥对数据进行加密和解密,确保数据在传输过程中不被窃听。效率:对称加密算法(如AES)计算速度快,适合加密大量数…...
Lab Cloud FPGA 硬件在线实验云平台介绍
友晶科技依托其在FPGA技术领域的深厚积累,成功研发出了一套完整的FPGA云平台解决方案(即FPGA 硬件在线实验云,简称LabCloud )。LabCloud 是一个高效、实用的学习平台,目前已在多个学校成功部署。 LabCloud 是通过 B/S …...
相机回调函数为静态函数原因
在注册相机SDK的回调函数时,是否需要设置为静态函数取决于具体SDK的设计要求,但通常需要遵循以下原则: 1. 必须使用静态函数的情况 当相机SDK是C语言接口或要求普通函数指针时,回调必须声明为静态成员函数或全局函数:…...
实验室纯水器实验室超纯水机(常见类型、选型建议、维护保养)
不同实验室用水级别有何差异? 实验室用水级别由ASTM或ISO 3696等质量标准定义,有助于特定应用选择适合的水质。这些标准也考虑了生产成本,如1级(Type 1)超纯水的生产成本远高于2级(Type 2)或3级(Type 3)纯水。 1级超纯水 不含离子ÿ…...
腾讯云COS与ZKmall 开源商城的存储集成方案
ZKmall 开源商城与腾讯云对象存储(COS)的集成,可通过云端资源托管、自动化数据同步、高性能存储架构实现本地存储负载降低与访问效率提升。以下是基于搜索结果的集成路径与核心优化点: 一、存储架构升级:本地与云端协同…...
Python 深度学习实战 第3章 Keras和TensorFlowKeras 训练和评估模型实例
Python 深度学习实战 第3章 Keras和TensorFlow&Keras 训练和评估模型实例 内容概要 第3章介绍了Keras和TensorFlow的基本概念及其关系,并指导如何设置深度学习工作区。本章还概述了核心深度学习概念如何转化为Keras和TensorFlow API。通过本章,读者…...
基于SpringBoot的动物救助中心系统(源码+数据库)
500基于SpringBoot的动物救助中心系统,本系统共分为2个角色:系统管理员、用户,主要功能如下 【管理员】: 1. 登录:管理员可以通过登录系统来管理各种功能。 2. 用户管理:管理员可以查看用户列表࿰…...
【多模态大模型】《Qwen2.5-Omni》 论文解读
《Qwen2.5-Omni:重新定义端到端全模态大模型的技术范式》 论文解读 论文: https://arxiv.org/abs/2503.20215 (2025.03.26)代码: https://github.com/QwenLM/Qwen2.5-OmniNews: https://mp.weixin.qq.com/…...
go 通过汇编分析函数传参与返回值机制
文章目录 概要一、前置知识二、汇编分析2.1、示例2.2、汇编2.2.1、 寄存器传值的汇编2.2.2、 栈内存传值的汇编 三、拓展3.1 了解go中的Duff’s Device3.2 go tool compile3.2 call 0x46dc70 & call 0x46dfda 概要 在上一篇文章中,我们研究了go函数调用时的栈布…...
蓝桥杯C/C++省赛/国赛注意事项及运行环境配置
大佬的蓝桥杯考前急救指南 对拍(手动生成测试数据)代码: #include <bits/stdc.h> // 包含所有标准库的头文件 using namespace std; // 使用标准命名空间int main() {srand(time(0)); // 设置随机数种子为当前时间,确保每次…...
CSS高度坍塌?如何解决?
一、什么是高度坍塌? 高度坍塌(Collapsing Margins)是指当父元素没有设置边框(border)、内边距(padding)、内容(content)或清除浮动时,其子元素的 margin 会…...
redis的基本使用
简介 redis,Remote Dictionary Server,远程字典服务,一个基于内存的、存储键值对的数据库。redis是开源的,使用C语言编写。因为redis的数据是存储在内存中的,所以redis通常被用来做数据库的缓存 优点: re…...
【蓝桥杯】单片机设计与开发,第十二届
/*头文件声明区*/ #include <STC15F2K60S2.H>//单片机寄存器头文件 #include <init.h>//初始化底层驱动头文件 #include <led.h>//led,蜂鸣器,继电器底层驱动头文件 #include <key.h>//按键底层驱动头文件 #include <seg.h>//数码管底层驱动头…...