c#软件开发学习笔记--Winform窗体第二期 WinForm 学习总结 - 第二十三天一、登录功能与窗体切换1.1 应用程序入口namespace_01_登录{internalstaticclassProgram{[STAThread]staticvoidMain(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);LoginFrmloginFrmnewLoginFrm();// 使用 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.TextadmintxtPassword.Textadmin)){MessageBox.Show(账号或密码出错请重新输入);return;}// 登录成功设置返回结果DialogResultDialogResult.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 处理用户选择DialogResultresMessageBox.Show(确认删除吗,删除,MessageBoxButtons.OKCancel);if(resDialogResult.OK){// 用户点击确定Controls.Remove(label1);}五、RadioButton 控件单选框5.1 特性互斥性同一容器内只能选择一个Checked 属性true表示选中false表示未选中CheckedChanged 事件选中状态改变时触发5.2 代码示例publicpartialclassForm1:Form{publicForm1(){InitializeComponent();// 创建Panel作为容器Panelp1newPanel();p1.BackColorColor.Red;p1.SizenewSize(100,100);p1.LocationnewPoint(330,0);// 创建单选框RadioButtonr1newRadioButton();r1.Text男;r1.LocationnewPoint(30,10);p1.Controls.Add(r1);RadioButtonr2newRadioButton();r2.Text女;r2.LocationnewPoint(30,30);r2.Checkedtrue;// 默认选中p1.Controls.Add(r2);// 添加事件处理r1.CheckedChangedFanfan;r2.CheckedChangedFanfan;this.Controls.Add(p1);}publicvoidFanfan(objecto,EventArgse){RadioButtonroasRadioButton;if(r.Checked){Console.WriteLine(选择了r.Text);}}}5.3 关键要点互斥性同一容器内的 RadioButton 自动互斥分组不同容器Panel/GroupBox中的 RadioButton 互不影响事件CheckedChanged在选中状态改变时触发六、CheckBox 控件复选框6.1 特性独立选择每个 CheckBox 独立不互斥Checked 属性true表示勾选false表示未勾选CheckedChanged 事件勾选状态改变时触发6.2 代码示例publicpartialclassForm1:Form{publicForm1(){InitializeComponent();// 动态创建 CheckBoxCheckBoxc1newCheckBox(){Textnew出来的多选框,LocationnewPoint(180,100),Checkedtrue,// 默认勾选};Controls.Add(c1);// 绑定事件checkBox2.CheckedChangedcheckBox1_CheckedChanged;checkBox3.CheckedChangedcheckBox1_CheckedChanged;c1.CheckedChangedcheckBox1_CheckedChanged;}privatevoidcheckBox1_CheckedChanged(objectsender,EventArgse){CheckBoxc(CheckBox)sender;if(c.Checked){Console.WriteLine(c.Text);}}}七、ListBox 控件列表框7.1 选择模式SelectionMode说明None不可选择One单选默认MultiSimple多选点击切换MultiExtended多选支持 Ctrl/Shift7.2 代码示例publicpartialclassForm1:Form{publicForm1(){InitializeComponent();// 添加项listBox1.Items.Add(罗志祥);listBox1.Items.Add(李云迪);listBox1.Items.Add(蔡徐坤);// 动态创建 ListBoxListBoxlistBoxnewListBox();listBox.LocationnewPoint(100,20);listBox.SizenewSize(100,180);Controls.Add(listBox);// 批量添加string[]stringsnewstring[]{111,222,333};listBox.Items.AddRange(strings);// 设置多选模式listBox.SelectionModeSelectionMode.MultiSimple;// 绑定事件listBox.SelectedIndexChangedXuanzhong;}publicstaticvoidXuanzhong(objectsender,EventArgse){ListBoxl1senderasListBox;// 单选获取选中项// Console.WriteLine(l1.SelectedItem);// Console.WriteLine(l1.SelectedIndex);// 多选遍历所有选中项stringssstring.Empty;foreach(variteminl1.SelectedItems){ssitem;}Console.WriteLine(ss);}}八、ComboBox 控件下拉框8.1 特性结合文本框和列表框功能支持输入和选择DropDownStyle属性控制行为8.2 代码示例publicpartialclassForm1:Form{publicForm1(){InitializeComponent();// 动态创建 ComboBoxComboBoxcbnewComboBox();cb.SizenewSize(60,30);cb.LocationnewPoint(100,100);Controls.Add(cb);// 添加项cb.Items.AddRange(newstring[]{吴亦凡,罗志祥});// 绑定事件cb.SelectedIndexChangedGaibian;}publicstaticvoidGaibian(objectsender,EventArgse){ComboBoxcbsenderasComboBox;Console.WriteLine(cb.SelectedItem);// 获取选中项Console.WriteLine(cb.SelectedIndex);// 获取选中索引}}九、NumericUpDown 控件数字输入框9.1 主要属性属性说明Value当前数值decimal 类型Minimum最小值Maximum最大值Increment增减步长DecimalPlaces小数位数ThousandsSeparator是否显示千位分隔符9.2 代码示例publicpartialclassForm1:Form{publicForm1(){InitializeComponent();NumericUpDownnumnewNumericUpDown();num.Value10;// 初始值num.Minimum0;// 最小值num.Maximum100;// 最大值num.Increment2;// 步长num.DecimalPlaces0;// 小数位数Controls.Add(num);// 绑定值改变事件num.ValueChangednewEventHandler(numValueChanged);}privatevoidnumValueChanged(objectsender,EventArgse){NumericUpDownnum(NumericUpDown)sender;MessageBox.Show(当前的值是: num.Value.ToString());}}十、PictureBox 控件图片框10.1 图片加载方式// 方式1从文件加载pictureBox.ImageImage.FromFile(C:\Images\0001.PNG);// 方式2设置图片路径pictureBox.ImageLocationC:\Images\0001.PNG;// 方式3从资源加载pictureBox.ImageProperties.Resources.background;10.2 SizeMode 属性SizeMode说明Normal图片位于左上角超出部分被剪切StretchImage拉伸图片以适应控件可能失真Zoom保持比例缩放完整显示AutoSize控件根据图片自动调整大小CenterImage图片居中显示超出部分被剪切10.3 代码示例pictureBox1.SizenewSize(200,150);pictureBox1.LocationnewPoint(10,10);pictureBox1.SizeModePictureBoxSizeMode.StretchImage;pictureBox1.ImageImage.FromFile(C:\Images\0001.PNG);// 点击事件pictureBox1.Click(sender,e){MessageBox.Show(图片被点击了);};十一、ImageList 组件11.1 特性存储和管理多个图像供其他控件共享使用如 ListView、TreeView减少内存占用11.2 轮播图示例publicpartialclassForm1:Form{intindex0;publicForm1(){InitializeComponent();}privatevoidForm1_Load(objectsender,EventArgse){// 显示第一张图pictureBox1.ImageimageList1.Images[index];}privatevoidbutton1_Click(objectsender,EventArgse){// 切换到下一张index;if(indeximageList1.Images.Count){index0;}pictureBox1.ImageimageList1.Images[index];}}十二、核心概念总结12.1 窗体生命周期构造函数 → Load事件 → 显示 → 用户交互 → FormClosing → 关闭12.2 事件处理模式// 方式1设计器绑定privatevoidbutton1_Click(objectsender,EventArgse){}// 方式2代码绑定Lambdabtn.Click(sender,e){MessageBox.Show(点击);};// 方式3代码绑定方法引用btn.Clickbutton1_Click;// 移除事件btn.Click-button1_Click;12.3 控件创建方式// 方式1设计器拖放可视化// 方式2代码动态创建ControlcontrolnewControlType();control.Propertyvalue;this.Controls.Add(control);十三、实用技巧控件访问通过Name属性或Controls集合访问控件类型转换使用as关键字安全转换sender对象资源管理使用Properties.Resources管理项目资源线程安全UI 更新应在 UI 线程执行使用Control.Invoke内存优化使用ImageList共享图像资源十四、使用场景模态对话框用于需要用户确认的操作如登录、确认删除非模态对话框用于辅助功能如工具栏、搜索框Controls 集合用于批量操作或动态控件管理消息提示应适度使用避免频繁弹窗影响用户体验单选框分组使用Panel或GroupBox容器图片显示根据需求选择合适的SizeMode