C#多窗口切换

news2024/9/29 3:33:25

多窗口切换

【功能目标】

1、实现多窗口切换(Panel)

2、动态生成窗口内文本框以及标签(重点)

3、改变文本框内容

【效果图】

【代码详解】

1、多窗口切换

如要实现多窗口切换,需要用到Panel,对于这个控件不熟悉的可以看我上一篇介绍;

Panel是容器控件,我们需要把这些页面的控件分别放入四个容器中,每个容器开始都设计为不显示属性(Visible = false);

当点击按钮时切换页面,改变显示属性;

如下代码所示

当前有四个容器

group_voltage、group_soc、group_soh、group_fujia

private void Btn_Volatage_Click(object sender, EventArgs e)

{//电压显示

State_Show = 0;

group_voltage.Visible = true;

group_soc.Visible = false;

group_soh.Visible = false;

group_fujia.Visible = false;

}

private void Btn_SOC_Click(object sender, EventArgs e)

{//SOC显示

State_Show = 1;

group_voltage.Visible = false;

group_soc.Visible = true;

group_soh.Visible = false;

group_fujia.Visible = false;

//this.group_soc.BringToFront();

}

private void Btn_SOH_Click(object sender, EventArgs e)

{

State_Show = 2;

group_voltage.Visible = false;

group_soc.Visible = false;

group_soh.Visible = true;

group_fujia.Visible = false;

}

private void Btn_ADD_Click(object sender, EventArgs e)

{

State_Show = 3;

group_voltage.Visible = false;

group_soc.Visible = false;

group_soh.Visible = false ;

group_fujia.Visible = true;

}

2、动态生成文本框数组

利用一个循环,不断声明,在每个循环中,首先先声明一个控件类,然后修改她的名字(也就是ID),再者修改它的TEXT,长度,宽度。

然后最后有一句将标签或者文本框装入容器

group_voltage.Controls.Add(Label_Voltage);//将字符添加到容器group_voltage中

[小提示]

Control是什莫?

Control是控件类;容器类控件有此属性,因为他的内部可以添加控件。

此处有个问题,就是容器如果拖拉到重合的话,会发生一个问题,容器1可能被拉入容器2,就是容器被放入容器。我们需要的是这几个容器是独立的。

那么需要怎末解决呢?

我们一开始不要将其位置属性调好。只需要一个调好即可,其他的打乱。

如下图所示:

图中四个方框就是四个容器,然后我们在代码初始化中对其进行操作。

也就是每各容器需要设置宽度

//设置宽度

this.group_voltage.Width = 552;

this.group_voltage.Height = 363;

然后其他容器还需要多设定一个,让容器的Location和容器1相等。

group_soc.Location = group_voltage.Location;

下方示例代码,有文本框以及标签的声明。

对于标签文字,我们直接循环来实现。

而对于文本框,我们需要改变文本框里面的值,所以我们采用数组。

在主程序中需要声明四个数组,全局变量。

/*声明数据数组*/

/*1电池电压数组2电池SOC数组3电池SOH数组*/

TextBox[] Voltage_Battery = new TextBox[5 * 20];

TextBox[] Soc_Battery = new TextBox[5 * 20];

TextBox[] Soh_Battery = new TextBox[5 * 20];

TextBox[] Fj_Battery = new TextBox[5 * 20];

之后对数组操作部分代码如下所示

public void PAGE_Init()

{

//声明暂存变量

int i=0,j=0;

//1电池组电压容器创建

//添加文本框与字符

for (i = 0; i < 5;i++ )

{

for (j=0;j<20;j++)

{

//创建标签与显示窗体

Label Label_Voltage = new Label();

//设置标签属性

Label_Voltage.Name = "Label_Volatage" + (i + j * 5 + 1).ToString();

Label_Voltage.Text = "电池" + (i + j * 5 + 1).ToString();

Label_Voltage.Width = Width_Label;

Label_Voltage.Height = Height_Label;

//位置确定

Label_Voltage.Location = new Point(15 + i * (Width_Label + Width_Text + 6), 15 + j * (12 + Height_Label));

group_voltage.Controls.Add(Label_Voltage);//将字符添加到容器1中

//电池组电压数组设置

Voltage_Battery[i + j * 5] = new TextBox();//注意!!!先声明对象

Voltage_Battery[i + j * 5].Name = "Voltage_Battery" + i.ToString();

Voltage_Battery[i + j * 5 ].Text = (i + j * 5 + 1).ToString();

Voltage_Battery[i + j * 5].Width = Width_Text;

Voltage_Battery[i + j * 5].Height = Height_Text;

Voltage_Battery[i + j * 5 ].Location = new Point(67 + i * (Width_Label + Width_Text + 6), 11 + j * (4 + Height_Text));

group_voltage.Controls.Add(Voltage_Battery[i + j * 5]);//将电压组添加到容器1中

}

}

//设置宽度

this.group_voltage.Width = 552;

this.group_voltage.Height = 363;

//SOC容器搭建

//添加文本框与字符

for (i = 0; i < 5; i++)

{

for (j = 0; j < 20; j++)

{

//创建标签

Label Label_Soc = new Label();

//设置标签属性

Label_Soc.Name = "Label_SOC" + (i + j * 5 + 1).ToString();

Label_Soc.Text = "SOC" + (i + j * 5 + 1).ToString();

Label_Soc.Width = Width_Label;

Label_Soc.Height = Height_Label;

//设置文本框数组属性

Soc_Battery[i + j * 5] = new TextBox();//注意!!!先声明对象

Soc_Battery[i + j * 5].Name = "SOC_Battery" + (i + j * 5 + 1).ToString();

Soc_Battery[i + j * 5].Text = (i + j * 5 + 1).ToString();

Soc_Battery[i + j * 5].Width = Width_Text;

Soc_Battery[i + j * 5].Height = Height_Text;

//位置确定

Label_Soc.Location = new Point(15 + i * (Width_Label + Width_Text + 6), 15 + j * (12 + Height_Label));

group_soc.Controls.Add(Label_Soc);//将字符添加到容器2中

Soc_Battery[i + j * 5].Location = new Point(67 + i * (Width_Label + Width_Text + 6), 11 + j * (4 + Height_Text));

group_soc.Controls.Add(Soc_Battery[i + j * 5]);//将SOC添加到容器2中

}

}

//设置宽度位置

this.group_soc.Width = 552;

this.group_soc.Height = 363;

group_soc.Location = group_voltage.Location;

}

3、文本框内容改变

当文本框内容需要改变时,我们直接修改TEXT即可。

下面还有一个遍历控件的函数可以检测控件中符合要求的。(做保留学习用)

如下代码如下所示

foreach (Control C in group_voltage.Controls)//遍历容器中每个控件

{

if (C.Name == "Voltage_Battery10")

{//如果此控件的名字为?则

C.Text = temp1.ToString();

temp1++;

}

} /**/

【功能目标】

1、外部插件使用学习

2、对数据进行EXCEL保存

【效果图】

效果图如下所示:

【代码讲解】

1、添加引用

首先在资源管理器中添加引用,如下图所示。右击添加引用

再到扩展里面寻找需要用到的插件。

譬如我们使用EXCEL插件

如下图所示(EXCEL插件)

此时你就可以再程序中调用EXCEL了。

2、创建新建文件窗口

此处需要用到一个类SaveFileDialog

相关介绍参考官方文件

https://msdn.microsoft.com/zh-cn/library/system.windows.forms.savefiledialog.aspx

我们需要掌握的总结如下

//可能要获取的路径名

string localFilePath = "", fileNameExt= "", newFileName= "", FilePath = "";

SaveFileDialog saveFileDialog = new SaveFileDialog();

//设置文件类型

//书写规则例如:txt files(*.txt)|*.txt

saveFileDialog.Filter = "txt files(*.txt)|*.txt|xls files(*.xls)|*.xls|All files(*.*)|*.*";

//设置默认文件名(可以不设置)

saveFileDialog.FileName = "siling-Data";

//主设置默认文件extension(可以不设置)

saveFileDialog.DefaultExt = "xml";

//获取或设置一个值,该值指示如果用户省略扩展名,文件对话框是否自动在文件名中添加扩展名。(可以不设置)

saveFileDialog.AddExtension = true;

//设置默认文件类型显示顺序(可以不设置)

saveFileDialog.FilterIndex = 2;

//保存对话框是否记忆上次打开的目录

saveFileDialog.RestoreDirectory = true;

// Show save file dialog box

DialogResult result = saveFileDialog.ShowDialog();

//点了保存按钮进入

if (result == DialogResult.OK)

{

//获得文件路径

localFilePath = saveFileDialog.FileName.ToString();

//获取文件名,不带路径

//fileNameExt = localFilePath.Substring(localFilePath.LastIndexOf("\\") + 1);

//获取文件路径,不带文件名

//FilePath = localFilePath.Substring(0, localFilePath.LastIndexOf("\\"));

//给文件名前加上时间

//newFileName = DateTime.Now.ToString("yyyyMMdd") + fileNameExt;

//在文件名里加字符

//saveFileDialog.FileName.Insert(1,"dameng");

//为用户使用 SaveFileDialog 选定的文件名创建读/写文件流。

//System.IO.FileStream fs = (System.IO.FileStream)saveFileDialog.OpenFile();//输出文件

//fs可以用于其他要写入的操作

}

设计代码如下

private string ShowSaveFileDialog()

{

string localFilePath = "";// fileNameExt, newFileName, FilePath;

SaveFileDialog sfd = new SaveFileDialog();//保存文件窗口

//设置文件类型

sfd.Filter = "Excel文件(*.xlsx)|*.xlsx";//保存类型为EXCEL

//保存对话框是否记忆上次打开的目录

sfd.RestoreDirectory = true;

//点了保存按钮进入

if (sfd.ShowDialog() == DialogResult.OK)

{

localFilePath = sfd.FileName.ToString(); //获得文件路径

//string fileNameExt = localFilePath.Substring(localFilePath.LastIndexOf("\\") + 1); //获取文件名,不带路径

//获取文件路径,不带文件名

//FilePath = localFilePath.Substring(0, localFilePath.LastIndexOf("\\"));

}

return localFilePath;//返回值为地址

}

3、文件写入

介绍一个Application类

Microsoft.Office.Interop.Excel.Application - 就是我们的excel应用程序类。

Workbook - 就是我们平常见的一个个excel文件,经常是使用Workbooks类对其进行操作。

Worksheet - 就是excel文件中的一个个sheet页。

Worksheet.Cells[row, column] - 就是某行某列的单元格,注意这里的下标row和column都是从1开始的,跟我平常用的数组或集合的下标有所不同。

首先创建一个EXCEL文档,调用上面我们做得那个方法。

然后新建一个EXCEL类,然后操作如下程序所示

private void Btn_DataSave_Click(object sender, EventArgs e)

{//数据存储

/*******************数据导入Excel**********************/

string fileName = ShowSaveFileDialog(); //文件的保存路径和文件名

try

{

// 创建Excel文档类

Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();

//创建EXCEL文档

Microsoft.Office.Interop.Excel.Workbook ExcelDoc = ExcelApp.Workbooks.Add(Type.Missing);

// 创建一个EXCEL页

Microsoft.Office.Interop.Excel.Worksheet xlSheet = ExcelDoc.Worksheets.Add(Type.Missing,

Type.Missing, Type.Missing, Type.Missing);

ExcelApp.DisplayAlerts = false;

// 单元格下标是从[1,1]开始的

xlSheet.Cells[1, 1] = "序号";

xlSheet.Cells[1, 2] = "电压";

xlSheet.Cells[1, 3] = "SOC";

xlSheet.Cells[1, 4] = "SOH";

xlSheet.Cells[1, 5] = "温度";

//遍历存数据

for (int i = 0; i < 100; i++)

{

xlSheet.Cells[i + 2, 1] = "电池" + i.ToString();

}

for (int i = 0; i < 100;i++ )

{

xlSheet.Cells[i + 2, 2] = Voltage_Battery[i].Text;

}

for (int i = 0; i < 100; i++)

{

xlSheet.Cells[i + 2, 3] = Soc_Battery[i].Text;

}

for (int i = 0; i < 100; i++)

{

xlSheet.Cells[i + 2, 4] = Soh_Battery[i].Text;

}

// 文件保存完毕输出信息

//将此页保存到我们新建的文档中

xlSheet.SaveAs(fileName);

//释放EXCEL资源

ExcelDoc.Close(Type.Missing, fileName, Type.Missing);

ExcelApp.Quit();

MessageBox.Show("数据保存成功!");

}

catch

{

MessageBox.Show("数据保存失败!");

}

}

更多介绍参考

https://wenku.baidu.com/view/a753ecc4b4daa58da1114a5e.html

详细代码请到GitHub上获取

https://github.com/Harryjun/BMS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/375489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

正演(1): 二维声波正演模拟程序(中心差分)Python实现

目录 1、原理&#xff1a; 1&#xff09;二维声波波动方程: ​编辑 2&#xff09;收敛条件&#xff08;不是很明白&#xff09; 3&#xff09;雷克子波 4&#xff09;二维空间衰减函数 5&#xff09;边界吸收条件 (不是很明白。。) 2、编程实现 1&#xff09;参数设置&…

RNN相关知识总结

目录RNN结构与原理1.模型总览2.反向传播LSTM结构与原理1.模型总览2.如何解决RNN梯度消失/爆炸问题&#xff1f;GRU结构及原理1.模型总览LSTM与GRU的区别RNN结构与原理 1.模型总览 上图是RNN的展开结构图&#xff0c;由输入层、隐藏层和输出层组成。当前时间步t 的隐藏状态hth_…

Spark 分析计算连续三周登录的用户数

前言&#xff1a;本文用到了窗口函数 range between&#xff0c;可以参考这篇博客进行了解——窗口函数rows between 、range between的使用 创建数据环境 在 MySQL 中创建数据测试表 log_data&#xff1a; create table if not exists log_data( log_id varchar(200) comm…

能在软路由docker给部署搭建teamsperk服务器么?并且设置好ddns

参考链接(4条消息) 【个人学习总结】使用docker搭建Teamspeak服务器_blcurtain的博客-CSDN博客_teamspeak3 docker(⊙﹏⊙)哎呀&#xff0c;崩溃啦&#xff01; (tdeh.top)TeamSpeak服务器搭建与使用 - 缘梦の镇 (cmsboy.cn)Openwrt X86 docker运行甜糖-软路由,x86系统,openwrt…

(四)K8S 安装 Nginx Ingress Controller

ingress-nginx 是 Kubernetes 的入口控制器&#xff0c;使用NGINX作为反向代理和负载均衡器 版本介绍 版本1&#xff1a;Ingress NGINX Controller(k8s社区的ingres-nginx) 以 NGINX 开源技术为基础&#xff08;kubernetes.io&#xff09;&#xff0c;可在GitHub的 kubernet…

如何创建并管理一个刷题小组?

“如何收回用户对题库的使用权”&#xff0c;这是一个大多数题库创建人都会碰到的管理问题&#xff0c;也是日常咨询频繁的问题。土著刷题在v1.10版本已经上线了小组模块功能&#xff0c;小组拥有丰富的用户管理功能&#xff0c;可以管理组员对于题库的使用权进行有效的管理。咱…

高压放大器在应力波法套筒灌浆密实度检测研究中的应用

实验名称&#xff1a;高压放大器在应力波法套筒灌浆密实度检测研究中的应用研究方向&#xff1a;无损检测测试目的&#xff1a;钢筋套筒灌浆连接技术被广泛应用于装配式建筑节点连接中&#xff0c;但灌浆不密实将导致节点失效的风险。因此&#xff0c;施工中对套筒灌浆的密实度…

使用xca工具生成自签证书

本文使用 xca 生成自签证书。 概述 之前使用 openssl 生成证书&#xff0c;在 golang 中测试&#xff0c;发现客户端连接失败&#xff0c;经查发现是Subject Alternative Name不支持导致的。因虚拟机 openssl 版本较低&#xff0c;有个功能无法实现&#xff0c;且升级麻烦&…

SAP SD模块学习总结2 2023.2.27

https://www.cnblogs.com/jiangzhengjun/p/7264657.html#_Toc410466840 首先是表&#xff1a; VBAK: 销售订单抬头 VBAP: 销售订单项目 VBUK: 抬头状态 VBUP: 行项目状态 VBKD:销售凭证&#xff1a; 业务数据 VBPA: 销售凭证: 合作伙伴 VBEP&#xff1a;销售凭证&#xff1a;…

【论文速递】COLING 2022 - 带有事件论元相关性的事件因果关系抽取

【论文速递】COLING 2022 - 带有事件论元相关性的事件因果关系抽取 【论文原文】&#xff1a;Event Causality Extraction with Event Argument Correlations 【作者信息】&#xff1a;Cui, Shiyao and Sheng, Jiawei and Cong, Xin and Li, Quangang and Liu, Tingwen and S…

Android NDK动态加载SO库

背景对于一个普通的android应用来说&#xff0c;so库的占比通常都是巨高不下的&#xff0c;因为我们无可避免的在开发中遇到各种各样需要用到native的需求&#xff0c;所以so库的动态化可以减少极大的包体积&#xff0c;自从2020腾讯的bugly团队发部关于动态化so的相关文章后&a…

fuse:纠结的page下刷流程之fuse_writepage_in_flight

fuse&#xff1a;纠结的page下刷流程细节之fuse_writepage_in_flightfuse_writepage_in_flight硬爬代码自己理解消化作者本人如是说fuse_writepage_in_flight 先说下这个函数&#xff0c;位于fs/fuse/file.c&#xff0c;这里以4.19内核来分析。因为这个函数里面藏了很多小细节…

华为OD机试模拟题 用 C++ 实现 - 删除指定目录(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明删除指定目录题目输入输出示例一输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为…

Macbook M1 安装PDI(Kettle) 9.3

Macbook M1 安装PDI(Kettle) 9.3 当前 PDI&#xff08;Kettle&#xff09;最新版为9.3&#xff0c;依赖Java JDK 11。因为没有专门用于 M1的程序&#xff0c;需要下载并安装x86_64架构的JDK及依赖软件&#xff0c;并 “强制在Intel模式下运行shell” 的方式来实现 Kettle 的正…

骨传导蓝牙耳机排行,盘点几款性能不错的骨传导耳机

随着蓝牙耳机的普及&#xff0c;骨传导耳机也越来越受到欢迎&#xff0c;很多人也都开始在了解并尝试骨传导耳机。相比于其他类型耳机&#xff0c;在舒适度、安全方面有一定优势。尤其是在户外运动时&#xff0c;或者长时间佩戴运动时&#xff0c;使用骨传导耳机可以避免耳朵因…

从“入门”到“专家”,一份3000字完整的性能测试体系的知识分享

随着科技的飞速发展&#xff0c;软件产品广泛应用于各个行业领域&#xff0c;人们对计算机和网络的依赖性越来越大&#xff0c;对新奇事物也越来越感兴趣&#xff0c;成千上万的用户活跃在庞大的网络系统中&#xff0c;这给提供服务的系统带来严重的负荷&#xff0c;"高并…

QT之图形视图框架概述——Graphics View Framework

QT之图形视图框架概述——Graphics View Framework1. 概述2. 核心类3. 事件传递4. Graphics View 坐标系统5. 参考1. 概述 Graphics View Framework是子Qt 4.2引入的&#xff0c;用来取代之前版本中的QCanvas。Graphics View Framework提拱了用于大量2D图形项的管理和交互的能…

Spring Boot 统一功能处理(用户登录权限效验-拦截器、异常处理、数据格式返回)

文章目录1. 统一用户登录权限效验1.1 最初用户登录权限效验1.2 Spring AOP 统一用户登录验证1.3 Spring 拦截器1.4 练习&#xff1a;登录拦截器1.5 拦截器实现原理1.6 统一访问前缀添加2. 统一异常处理3. 统一数据格式返回3.1 统一数据格式返回的实现3.2 ControllerAdvice 源码…

day21_IO

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、File 三、IO流 四、字节输入&输出流 零、 复习昨日 见晨考 一、作业 见答案二、File 2.1 介绍 File,通过一个路径代表文件或者文件夹 …

Panda Farm:首个部署在 Arbitrum 上的轻量化 GameFi 游戏

在2月16日&#xff0c;Bitget平台宣布 Launchpad 重新启动&#xff0c;并推出了重启后的首个项目 Panda Farm&#xff08;BBO&#xff09;&#xff0c;该 Launchpad 启动后得到了较高的关注。 Panda Farm 是部署在 Arbitrum 上的 GameFi应用&#xff0c;这可能首先意味着 Bitge…