ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

C#----常用控件与三层架构

C#----常用控件与三层架构 思维导图常用控件ComboBox:结合了文本框和列表框的功能允许用户从预定义的选项中选择或输入自定义值。1.重要属性:item下拉选项集合text显示当前文本SelectedIndex:选中的对象DropDownStyle:2.获取选中的值SelectedItem当前选中的项对象类型 Object 常用的SelectedIndex当前选中项的索引从 0 开始-1 表示未选择获取/设置SelectedText: 当前选中的项的文本SelectedValue: 当前选中的选项的value值// 获取选中文本string selectText comboBox1.Text;// 或者string txt comboBox1.SelectedItem.ToString();// 判断有没有选中if(comboBox1.SelectedIndex -1){MessageBox.Show(请选择一项);}3.选中改变事件private void comboBox1_SelectedIndexChanged(object sender, EventArgs e){// 切换选项时执行string msg comboBox1.Text;label1.Text 你选择了 msg;}LinkLabel组件LinkLabel是Windows Forms中用于创建超链接样式的交互控件可模拟网页中的超链接行为支持自定义URL、事件处理和视觉效果。/ 添加链接区域指定文本范围和关联数据linkLabel1.Links.Add(0, 5, https://www.microsoft.com); // 位置0开始长度5ListBox 组件ListBox列表框是 Windows Forms 应用程序中常用的控件用于显示一个项目列表允许用户从中选择一个或多个项目。DateTimePicker组件DateTimePicker是Windows Forms中用于日期和时间选择的控件通过下拉日历和可选时间选择器为用户提供直观的日期时间输入方式。Value——获取或设置当前选中的日期时间PictureBox组件PictureBox是Windows Forms中用于显示图像的基础控件支持多种图像格式如BMP、JPEG、PNG等并提供缩放、拉伸、对齐等核心功能。属性:Image设置或获取显示的图像对象可通过本地资源或者项目资源导入图片当图片与PictureBox控件大小不一致怎么办呢SizeMode提供控制图像显示模式Normal原始大小可能超出控件范围StretchImage拉伸填充控件AutoSize控件自动调整为图像大小CenterImage居中显示不缩放Zoom等比例缩放以适应控件Timer 定时器属性Enabled - 定时器是否能起作用Interval- 定时器每隔多少毫秒执行一次。定时器方法start启动定时器。stop关闭定时器。ListView的视图View设置显示模式Details详细视图表格形式展示多列数据支持自定义列宽、对齐方式。List列表视图单列垂直排列适合简单选项。LargeIcon/SmallIcon大/小图标以图标形式展示支持自定义图标集。Tile平铺视图类似卡片布局展示图标和文本。DataGridView一、外观属性1.基本外观BorderStyle边框样式None, FixedSingle, Fixed3DGridColor网格线颜色DefaultCellStyle默认单元格样式BackColor/ForeColor背景/前景色Font字体Alignment内容对齐方式Format数据格式Padding内边距SelectionBackColor/SelectionForeColor选中时的颜色Font控件字体ForeColor前景色2.行和列外观RowHeadersVisible是否显示行标题列 默认每一行前面有一列ColumnHeadersVisible是否显示列标题行: 列头RowHeadersWidth行标题列宽度ColumnHeadersHeight列标题行高度RowTemplate行模板用于设置新行的默认属性二、行为属性1.选择行为MultiSelect是否允许多选SelectionMode选择模式CellSelect单个单元格FullRowSelect整行FullColumnSelect整列RowHeaderSelect点击行头选择整行ColumnHeaderSelect点击列头选择整列三、数据属性1.数据绑定DataSource数据源DataTable, List, Array等DataMember当DataSource包含多个列表时指定成员BindingContext获取或设置控件的绑定上下文三者区别属性作用类型使用时机DataSource设置数据源对象object几乎所有数据绑定场景DataMember指定数据源内部子集合名称stringDataSource 是 DataSet 这类多表容器时BindingContext获取 / 设置绑定上下文管理记录指针BindingContext需要多组独立绑定、分开控制当前行2.列集合Columns列集合DataGridViewColumnCollectionColumnCount列数ColumnHeadersDefaultCellStyle列标题默认样式3.行集合Rows行集合DataGridViewRowCollectionRowCount行数RowHeadersDefaultCellStyle行标题默认样式DataGridView控件当前状态CurrentCell获取或设置当前活动单元格CurrentRow获取当前行CurrentColumn获取当前列SelectedCells获取选中的单元格集合SelectedRows获取选中的行集合SelectedColumns获取选中的列集合既然是表格类型如何进行单行多行单列单个空格的操作呢通过选择行为与当前状态结合可以对单行多行单列单个空格进行操作。单行操作dataGridView1.SelectionMode DataGridViewSelectionMode.FullRowSelect; dataGridView1.MultiSelect false; // 获取选中行 DataGridViewRow row dataGridView1.SelectedRows[0];多行操作dataGridView1.SelectionMode DataGridViewSelectionMode.FullRowSelect; dataGridView1.MultiSelect true; // 开启多选 // 遍历所有选中行 foreach (DataGridViewRow row in dataGridView1.SelectedRows) { //批量删除/修改 }常用事件事件触发时机常用用途SelectionChanged选中行 / 单元格改变选中后加载详情CellClick点击单元格获取单元格信息CellBeginEdit单元格进入编辑控制是否允许编辑CellEndEdit单元格编辑结束保存修改后数据CellValidating单元格失去焦点前数据校验非法输入拦截UserDeletingRow用户删除行前删除确认、取消删除DataBindingComplete数据绑定完成初始化列属性三层架构1.UI界面层窗体、控件DataGridView、TextBox、Button只负责接收用户输入、展示数据、调用 BLL2.BLL业务逻辑层业务规则、校验、逻辑判断调用 DALUI 只能访问 BLLBAL 不能直接访问数据库3.DAL数据访问层专门和数据库打交道SQL 语句、ADO.NET、SqlConnection只做增删改查不做业务逻辑4.Model实体层对应数据库一张表一个类代表一行记录属性对应表字段。三层架构优势1.职责分离高内聚低耦合各模块只负责自己模块的职责不处理其他事务。2.便于维护修改方便职责分离之后代码功能出现错误能够更直接的排查出问题所在。3.代码复用DAL/BLL的方法可以给多个窗口使用不需要重复多次写代码。4.利于团队开发每个模块可由多人负责多人分工。5.方便单元测试业务逻辑可单独测试不需要启动窗体。6.结构清晰可读性强项目分层代码可快速定位功能。7.安全性提升分层可以防止非法数据进入数据库。缺点1.三层结构会使简单项目会变复杂。2.调用层级多性能较低注册案例解析三层架构UI层 - 注册界面流程实现ui界面代码中不包含任何数据处理或者业务逻辑判断仅仅只用界面事件触发的方法。通过点击注册按钮触发UI点击事件调用BLL层方法BLL层调用DAL层方法实现注册功能同时数据通过ModelUser类进行数据储存至SQL数据库。从而实现注册账号功能。public partial class RegisterForm : Form { public RegisterForm() { InitializeComponent(); } private void return_btn_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { this.Close(); } private void cencle_btn_Click(object sender, EventArgs e) { this.Close(); } private void confirm_btn_Click(object sender, EventArgs e) { string name name_Text.Text; string pwd pwd_Text.Text; //调用 RegisterBLL服务 RegisteBLL registeBLL new RegisteBLL(); try { registeBLL.Registe(name, pwd); UIMessageBox.ShowInfo(注册成功); name_Text.Clear(); pwd_Text.Clear(); this.Close(); } catch (Exception ex) { UIMessageBox.ShowError2(ex.Message); name_Text.Clear(); pwd_Text.Clear(); } }BLL层---业务逻辑处理代码中不包含任何数据处理只有对数据的校验。仅仅是对用户输入的账号密码进行数据逻辑处理。public void Registe(string username, string pwd) { //数据校验 if (string.IsNullOrEmpty(username)) { throw new LoginException(用户名不能为空); } if (string.IsNullOrEmpty(pwd)) { throw new LoginException(密码不能为空); } //调用DAL层的方法 RegisteDAL registeDAL new RegisteDAL(); try { //增添信息 Model.Admin registe registeDAL.Registe(username,pwd); if (registe ! null) { //添加成功 return; } } catch { throw; }DAL层---链接数据库对数据库的数据进行处理。public Model.Admin Registe(string username, string pwd) { string sql INSERT INTO dbo.Admin ( LoginId, LoginPwd) VALUES ( username, pwd);; //2.调用DBHelper的执行增添的方法、 ListSqlParameter parameters new ListSqlParameter() { new SqlParameter(username,username), new SqlParameter(pwd,pwd) }; var reader DBHelper.DBHelper.GetDateTable(sql, parameters); if (reader null) { return null; } // Model.Admin admin new Model.Admin(); admin.LoginId username; admin.LoginPwd pwd; reader.Clear(); return admin; }Model层---对数据继续封装,确保数据的安全性。public class Admin { private int adminId; public int AdminId { get { return adminId; } set { adminId value; } } private string loginId; public string LoginId { get { return loginId ; } set { loginId value; } } private string loginPwd; public string LoginPwd { get { return loginPwd; } set { loginPwd value; } }注册功能实现过程中遇到的代码问题DAL层中SQL问题注册SQL的参数名拼写错误SQL Server 会报必须声明标量变量 usernam。string sql INSERT INTO dbo.Admin ( LoginId, LoginPwd) VALUES ( usernam, pwd);;...new SqlParameter(username, username), // 名字对不上BLL层中业务逻辑问题用户名不存在 / 数据库异常时反而登录成功AdminBLL.cs 只处理了admin ! null 的情况当admin null 用户不存在或 DAL 因异常返回 null时方法不抛异常直接结束 LoginForm.cs 收到成功并进入主窗体。应在admin null 时throw new LoginException(用户名或密码错误);其他问题注册账号返回登录页面之后输入注册后的账号会显示登陆成功但是进入主界面RegisterForm.cs 返回/取消时new LoginForm().Show() 又开了一个新登录窗原窗还在而 Program.cs 只认最初那个实例的IsLogin 从新窗口登录后主程序不会启动。直接this.Close() 即可。NULL引用异常AdminDAL.cs GetRead 失败返回 null 时直接reader.Read() 会抛 NullReferenceException应先判空。
返回列表