news 2026/6/23 16:08:22

c#软件开发学习笔记--Winform窗体第二期

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
c#软件开发学习笔记--Winform窗体第二期

WinForm 学习总结 - 第二十三天


一、登录功能与窗体切换

1.1 应用程序入口

namespace_01_登录{internalstaticclassProgram{[STAThread]staticvoidMain(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);LoginFrmloginFrm=newLoginFrm();// 使用 ShowDialog() 以模态方式显示登录窗体if(loginFrm.ShowDialog()==DialogResult.OK){// 登录成功后显示主窗体Application.Run(newBankCustormerFrm("admin"));}}}}

1.2 登录窗体实现

publicpartialclassLoginFrm:Form{publicLoginFrm(){InitializeComponent();}privatevoidbtnLogin_Click(objectsender,EventArgse){// 验证账号if(string.IsNullOrWhiteSpace(txtAccount.Text)){label3.Text="账号不能为空白!";return;}// 验证密码if(string.IsNullOrWhiteSpace(txtPassword.Text)){MessageBox.Show("密码不能为空白!");return;}// 验证账号密码if(!(txtAccount.Text=="admin"&&txtPassword.Text=="admin")){MessageBox.Show("账号或密码出错,请重新输入!");return;}// 登录成功,设置返回结果DialogResult=DialogResult.OK;}}

1.3 主窗体接收参数

publicpartialclassBankCustormerFrm:Form{publicBankCustormerFrm(stringvalue){InitializeComponent();label1.Text=$"欢迎{value}进入";}}

二、模态对话框与非模态对话框

2.1 概念对比

特性模态对话框 (ShowDialog())非模态对话框 (Show())
窗口层级独占顶层,阻止操作其他窗口与主窗口平级,可自由切换
关闭方式Close()关闭并销毁Hide()隐藏(仍存在)
返回值返回DialogResult无返回值
典型场景登录框、确认框工具栏、属性面板

2.2 关闭应用程序的方式

// 1. 关闭当前窗口(非主窗口无法退出程序)this.Close();// 2. 退出所有窗体(无法处理非托管线程)Application.Exit();// 3. 退出调用线程上的所有消息Application.ExitThread();// 4. 最彻底的退出方式(强制退出所有线程)System.Environment.Exit(0);

推荐做法:在主窗体的FormClosed事件中使用:

privatevoidfrmMain_FormClosed(objectsender,FormClosedEventArgse){if(tip!=null){tip.Dispose();}Dispose();System.Environment.Exit(0);}

三、Controls 集合

3.1 遍历控件集合

publicpartialclassForm1:Form{publicForm1(){InitializeComponent();// 遍历窗体上所有控件foreach(ControlcinControls){Console.WriteLine(c);// 筛选特定类型控件if(cisButton){Console.WriteLine(c.Text);}}// 通过索引访问控件Console.WriteLine(Controls[0]);Console.WriteLine(Controls[1]);}}

四、消息提示框 (MessageBox)

4.1 基本用法

// 基本消息提示MessageBox.Show("提示信息");// 带标题MessageBox.Show("提示信息","窗口标题");// 带按钮类型和图标MessageBox.Show("提示信息","窗口标题",MessageBoxButtons.YesNo,MessageBoxIcon.Stop,MessageBoxDefaultButton.Button2);

4.2 MessageBoxButtons 枚举

枚举值按钮组合
OK确定
OKCancel确定、取消
YesNo是、否
YesNoCancel是、否、取消
RetryCancel重试、取消
AbortRetryIgnore中止、重试、忽略

4.3 MessageBoxIcon 枚举

枚举值图标样式
Information信息图标 (i)
Warning警告图标 (!)
Error错误图标 (X)
Question疑问图标 (?)
Asterisk信息图标
Exclamation警告图标
Hand错误图标
Stop错误图标

4.4 处理用户选择

DialogResultres=MessageBox.Show("确认删除吗","删除",MessageBoxButtons.OKCancel);if(res==DialogResult.OK){// 用户点击确定Controls.Remove(label1);}

五、RadioButton 控件(单选框)

5.1 特性

  • 互斥性:同一容器内只能选择一个
  • Checked 属性true表示选中,false表示未选中
  • CheckedChanged 事件:选中状态改变时触发

5.2 代码示例

publicpartialclassForm1:Form{publicForm1(){InitializeComponent();// 创建Panel作为容器Panelp1=newPanel();p1.BackColor=Color.Red;p1.Size=newSize(100,100);p1.Location=newPoint(330,0);// 创建单选框RadioButtonr1=newRadioButton();r1.Text="男";r1.Location=newPoint(30,10);p1.Controls.Add(r1);RadioButtonr2=newRadioButton();r2.Text="女";r2.Location=newPoint(30,30);r2.Checked=true;// 默认选中p1.Controls.Add(r2);// 添加事件处理r1.CheckedChanged+=Fanfan;r2.CheckedChanged+=Fanfan;this.Controls.Add(p1);}publicvoidFanfan(objecto,EventArgse){RadioButtonr=oasRadioButton;if(r.Checked){Console.WriteLine("选择了"+r.Text);}}}

5.3 关键要点

  1. 互斥性:同一容器内的 RadioButton 自动互斥
  2. 分组:不同容器(Panel/GroupBox)中的 RadioButton 互不影响
  3. 事件CheckedChanged在选中状态改变时触发

六、CheckBox 控件(复选框)

6.1 特性

  • 独立选择:每个 CheckBox 独立,不互斥
  • Checked 属性true表示勾选,false表示未勾选
  • CheckedChanged 事件:勾选状态改变时触发

6.2 代码示例

publicpartialclassForm1:Form{publicForm1(){InitializeComponent();// 动态创建 CheckBoxCheckBoxc1=newCheckBox(){Text="new出来的多选框",Location=newPoint(180,100),Checked=true,// 默认勾选};Controls.Add(c1);// 绑定事件checkBox2.CheckedChanged+=checkBox1_CheckedChanged;checkBox3.CheckedChanged+=checkBox1_CheckedChanged;c1.CheckedChanged+=checkBox1_CheckedChanged;}privatevoidcheckBox1_CheckedChanged(objectsender,EventArgse){CheckBoxc=(CheckBox)sender;if(c.Checked){Console.WriteLine(c.Text);}}}

七、ListBox 控件(列表框)

7.1 选择模式

SelectionMode说明
None不可选择
One单选(默认)
MultiSimple多选(点击切换)
MultiExtended多选(支持 Ctrl/Shift)

7.2 代码示例

publicpartialclassForm1:Form{publicForm1(){InitializeComponent();// 添加项listBox1.Items.Add("罗志祥");listBox1.Items.Add("李云迪");listBox1.Items.Add("蔡徐坤");// 动态创建 ListBoxListBoxlistBox=newListBox();listBox.Location=newPoint(100,20);listBox.Size=newSize(100,180);Controls.Add(listBox);// 批量添加string[]strings=newstring[]{"111","222","333"};listBox.Items.AddRange(strings);// 设置多选模式listBox.SelectionMode=SelectionMode.MultiSimple;// 绑定事件listBox.SelectedIndexChanged+=Xuanzhong;}publicstaticvoidXuanzhong(objectsender,EventArgse){ListBoxl1=senderasListBox;// 单选:获取选中项// Console.WriteLine(l1.SelectedItem);// Console.WriteLine(l1.SelectedIndex);// 多选:遍历所有选中项stringss=string.Empty;foreach(variteminl1.SelectedItems){ss+=item;}Console.WriteLine(ss);}}

八、ComboBox 控件(下拉框)

8.1 特性

  • 结合文本框和列表框功能
  • 支持输入和选择
  • DropDownStyle属性控制行为

8.2 代码示例

publicpartialclassForm1:Form{publicForm1(){InitializeComponent();// 动态创建 ComboBoxComboBoxcb=newComboBox();cb.Size=newSize(60,30);cb.Location=newPoint(100,100);Controls.Add(cb);// 添加项cb.Items.AddRange(newstring[]{"吴亦凡","罗志祥"});// 绑定事件cb.SelectedIndexChanged+=Gaibian;}publicstaticvoidGaibian(objectsender,EventArgse){ComboBoxcb=senderasComboBox;Console.WriteLine(cb.SelectedItem);// 获取选中项Console.WriteLine(cb.SelectedIndex);// 获取选中索引}}

九、NumericUpDown 控件(数字输入框)

9.1 主要属性

属性说明
Value当前数值(decimal 类型)
Minimum最小值
Maximum最大值
Increment增减步长
DecimalPlaces小数位数
ThousandsSeparator是否显示千位分隔符

9.2 代码示例

publicpartialclassForm1:Form{publicForm1(){InitializeComponent();NumericUpDownnum=newNumericUpDown();num.Value=10;// 初始值num.Minimum=0;// 最小值num.Maximum=100;// 最大值num.Increment=2;// 步长num.DecimalPlaces=0;// 小数位数Controls.Add(num);// 绑定值改变事件num.ValueChanged+=newEventHandler(numValueChanged);}privatevoidnumValueChanged(objectsender,EventArgse){NumericUpDownnum=(NumericUpDown)sender;MessageBox.Show("当前的值是: "+num.Value.ToString());}}

十、PictureBox 控件(图片框)

10.1 图片加载方式

// 方式1:从文件加载pictureBox.Image=Image.FromFile(@"C:\Images\0001.PNG");// 方式2:设置图片路径pictureBox.ImageLocation=@"C:\Images\0001.PNG";// 方式3:从资源加载pictureBox.Image=Properties.Resources.background;

10.2 SizeMode 属性

SizeMode说明
Normal图片位于左上角,超出部分被剪切
StretchImage拉伸图片以适应控件(可能失真)
Zoom保持比例缩放,完整显示
AutoSize控件根据图片自动调整大小
CenterImage图片居中显示,超出部分被剪切

10.3 代码示例

pictureBox1.Size=newSize(200,150);pictureBox1.Location=newPoint(10,10);pictureBox1.SizeMode=PictureBoxSizeMode.StretchImage;pictureBox1.Image=Image.FromFile(@"C:\Images\0001.PNG");// 点击事件pictureBox1.Click+=(sender,e)=>{MessageBox.Show("图片被点击了!");};

十一、ImageList 组件

11.1 特性

  • 存储和管理多个图像
  • 供其他控件共享使用(如 ListView、TreeView)
  • 减少内存占用

11.2 轮播图示例

publicpartialclassForm1:Form{intindex=0;publicForm1(){InitializeComponent();}privatevoidForm1_Load(objectsender,EventArgse){// 显示第一张图pictureBox1.Image=imageList1.Images[index];}privatevoidbutton1_Click(objectsender,EventArgse){// 切换到下一张index++;if(index>=imageList1.Images.Count){index=0;}pictureBox1.Image=imageList1.Images[index];}}

十二、核心概念总结

12.1 窗体生命周期

构造函数 → Load事件 → 显示 → 用户交互 → FormClosing → 关闭

12.2 事件处理模式

// 方式1:设计器绑定privatevoidbutton1_Click(objectsender,EventArgse){}// 方式2:代码绑定(Lambda)btn.Click+=(sender,e)=>{MessageBox.Show("点击");};// 方式3:代码绑定(方法引用)btn.Click+=button1_Click;// 移除事件btn.Click-=button1_Click;

12.3 控件创建方式

// 方式1:设计器拖放(可视化)// 方式2:代码动态创建Controlcontrol=newControlType();control.Property=value;this.Controls.Add(control);

十三、实用技巧

  1. 控件访问:通过Name属性或Controls集合访问控件
  2. 类型转换:使用as关键字安全转换sender对象
  3. 资源管理:使用Properties.Resources管理项目资源
  4. 线程安全:UI 更新应在 UI 线程执行,使用Control.Invoke
  5. 内存优化:使用ImageList共享图像资源

十四、使用场景

  1. 模态对话框用于需要用户确认的操作(如登录、确认删除)
  2. 非模态对话框用于辅助功能(如工具栏、搜索框)
  3. Controls 集合用于批量操作或动态控件管理
  4. 消息提示应适度使用,避免频繁弹窗影响用户体验
  5. 单选框分组使用PanelGroupBox容器
  6. 图片显示根据需求选择合适的SizeMode
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 15:52:36

Kubernetes 之资源对象 Pod详解

官网:https://kubernetes.io/docs/concepts/workloads/pods/ 简介 Pod 是 Kubernetes 中最小的可部署、可调度单元。 Kubernetes 不是直接管理单个容器,而是管理 Pod。一个 Pod 里面可以有一个容器,也可以有多个紧密协作的容器。这些容器共享存储、网络资源和运行规范;Po…

作者头像 李华
网站建设 2026/6/23 15:48:52

专业的金属矿山数智化标杆服务商

在当今的数字化转型浪潮中,金属矿山行业正面临着前所未有的挑战与机遇。山东艾特智能技术有限公司(以下简称“山东艾特”)作为行业的领军者,凭借其在金属矿山数智化领域的深厚积累和技术优势,为矿山企业提供了从技术研…

作者头像 李华
网站建设 2026/6/23 15:46:14

2026 年命理研究工具的功能和配套内容,会不会买了之后就不再更新了?第三方学习路径观察

命理研究工具的功能和配套内容,会不会买了之后就不再更新了? 这个问题在 2026 年越来越常见,核心原因是命理工具的使用场景已经从“快速排一张盘”进入到“长期研究、客户复盘和专业表达”的阶段。第三方观察来看,判断工具是否适合…

作者头像 李华
网站建设 2026/6/23 15:36:36

大语言模型推理优化:从思维链到潜在状态轨迹的范式跃迁

1. 项目概述:从“显式”到“隐式”的推理范式跃迁 最近在折腾大语言模型(LLM)推理优化时,一个绕不开的话题就是“思维链”。我们习惯了让模型在生成答案前,先“自言自语”地写下一段推理过程,这确实让它在解…

作者头像 李华
网站建设 2026/6/23 15:30:51

构建高质量专业基准:从知识抽取到专家协同的BAGEL数据集实践

1. 项目概述:为什么我们需要BAGEL基准?在人工智能,特别是大语言模型(LLM)如火如荼发展的今天,我们经常听到一个词:“幻觉”。模型可能会一本正经地胡说八道,尤其是在面对专业、垂直领…

作者头像 李华
网站建设 2026/6/23 15:24:31

阿尔伯塔软件项目管理 V 笔记(三)

E. 一份总结当时进展的旧备忘录。 https://github.com/OpenDocCN/cs-notes-pt3-zh/raw/master/docs/albt-swpjmgt5/img/8a2978ee313ff24c28578b60df801f0e_3.png 制品的定义是包容性的。这意味着任何被某人认为对项目重要或有意义的东西都可以被视为制品。因此,所…

作者头像 李华