Winform中控件与模型MVC

在Windows Forms (WinForms) 应用程序开发中,用户控件(UserControl)与模型(Model)的结合使用是一种常见的MVC(Model-View-Controller)模式的体现,能够有效地分离界面表示层与业务逻辑层,从而提高代码的可维护性和复用性。本文将通过一个具体的案例——一个简易的“学生信息管理系统”——来阐述如何在WinForms中利用用户控件与模型的配合,实现界面与数据的有效解耦。

一、定义模型(Model)

首先,我们需要定义一个表示学生信息的模型类。这个模型将承载学生的个人信息,如姓名、年龄、性别等。以下是一个简单的Student模型类定义:

 

Csharp

1public class Student
2{
3    public int ID { get; set; }
4    public string Name { get; set; }
5    public int Age { get; set; }
6    public string Gender { get; set; }
7}
二、创建用户控件(UserControl)

接下来,创建一个名为StudentInfoControl的用户控件,用于展示和编辑学生信息。这个控件将包含几个TextBox用于输入学生的名字、年龄和性别,以及一个Button用于提交修改。

 

Xml

1<uc:StudentInfoControl x:Class="StudentManagementApp.StudentInfoControl"
2             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
5             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
6             xmlns:uc="clr-namespace:StudentManagementApp.Controls"
7             mc:Ignorable="d" 
8             d:DesignHeight="140" d:DesignWidth="400">
9    <Grid>
10        <Label Content="Name:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="120"/>
11        <TextBox x:Name="txtName" HorizontalAlignment="Left" Height="23" Margin="136,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="200"/>
12        
13        <Label Content="Age:" HorizontalAlignment="Left" Margin="10,40,0,0" VerticalAlignment="Top" Width="120"/>
14        <TextBox x:Name="txtAge" HorizontalAlignment="Left" Height="23" Margin="136,40,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="200"/>
15
16        <Label Content="Gender:" HorizontalAlignment="Left" Margin="10,70,0,0" VerticalAlignment="Top" Width="120"/>
17        <TextBox x:Name="txtGender" HorizontalAlignment="Left" Height="23" Margin="136,70,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="200"/>
18
19        <Button x:Name="btnSave" Content="Save" HorizontalAlignment="Left" Margin="10,100,0,0" VerticalAlignment="Top" Width="75" Click="btnSave_Click"/>
20    </Grid>
21</uc:StudentInfoControl>

在C#代码中,我们需要实现事件处理和数据绑定:

 

Csharp

1public partial class StudentInfoControl : UserControl
2{
3    private Student _student;
4
5    public StudentInfoControl()
6    {
7        InitializeComponent();
8        this.Loaded += StudentInfoControl_Loaded;
9    }
10
11    private void StudentInfoControl_Loaded(object sender, RoutedEventArgs e)
12    {
13        if (_student != null)
14        {
15            txtName.Text = _student.Name;
16            txtAge.Text = _student.Age.ToString();
17            txtGender.Text = _student.Gender;
18        }
19    }
20
21    private void btnSave_Click(object sender, RoutedEventArgs e)
22    {
23        if (_student != null)
24        {
25            _student.Name = txtName.Text;
26            _student.Age = int.Parse(txtAge.Text);
27            _student.Gender = txtGender.Text;
28            // 调用控制器的更新方法
29            OnStudentUpdated(_student);
30        }
31    }
32
33    public event EventHandler<Student> StudentUpdated;
34
35    protected virtual void OnStudentUpdated(Student student)
36    {
37        StudentUpdated?.Invoke(this, student);
38    }
39
40    public void BindStudent(Student student)
41    {
42        _student = student;
43    }
44}
三、实现控制器(Controller)

在主窗体中,充当控制器的角色,负责实例化模型和用户控件,并处理数据的传递和更新。

 

Csharp

1public partial class MainForm : Form
2{
3    private Student _currentStudent = new Student();
4
5    public MainForm()
6    {
7        InitializeComponent();
8        studentInfoControl1.BindStudent(_currentStudent);
9    }
10
11    private void btnSave_Click(object sender, EventArgs e)
12    {
13        studentInfoControl1.SaveStudent(_currentStudent);
14    }
15}
16
17// 在MainForm.cs的设计视图中添加StudentInfoControl
我们可以看到,用户控件与模型的配合使用不仅提高了界面的灵活性和可复用性,同时也清晰地划分了业务逻辑和界面表示的职责,遵循了MVC设计模式的原则。在实际开发中,这种模式尤其适用于那些需要频繁更新和维护的界面组件,能够显著降低代码维护成本,提高开发效率。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《企业实战分享 · 常用运维中间件》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;如需交流&#xff…

HUAWEI MPLS 静态配置和动态LDP配置

MPLS(Multi-Protocol Label Switching&#xff0c;多协议标签交换技术)技术的出现&#xff0c;极大地推动了互联网的发展和应用。例如&#xff1a;利用MPLS技术&#xff0c;可以有效而灵活地部署VPN(Virtual Private Network&#xff0c;虚拟专用网)&#xff0c;TE(Traffic Eng…

a-range-picker 国际化不生效

1、问题&#xff1a;按照官方 添加后是这样的 周和月没有翻译 1-1官方配置如下图 1-2效果&#xff1a; 2、import locale from "ant-design-vue/es/date-picker/locale/zh_CN"; 打印出locale是这样的 这个文件翻译文件中没有相关翻译 3、解决&#xff1a; 简单粗…

【实战场景】记一次UAT jvm故障排查经历

【实战场景】记一次UAT jvm故障排查经历 开篇词&#xff1a;干货篇&#xff1a;1.查看系统资源使用情况2.将十进制进程号转成十六进制3.使用jstack工具监视进程的垃圾回收情况4.输出指定线程的堆内存信息5.观察日志6.本地环境复现 总结篇&#xff1a;我是杰叔叔&#xff0c;一名…

Objective-C使用块枚举的细节

对元素类型的要求 在 Objective-C 中&#xff0c;NSArray 只能存储对象类型&#xff0c;而不能直接存储基本类型&#xff08;例如 int&#xff09;。但是&#xff0c;可以将基本类型封装在 NSNumber 等对象中&#xff0c;然后将这些对象存储在 NSArray 中。这样&#xff0c;en…

H6922 便携移动储能升压恒压方案 2.8-40V耐压 7.5A大电流应用芯片IC

H6922芯片是一款便携移动储能升压恒压控制驱动芯片&#xff0c;满足2.8-40V宽输入电压范围的升压恒压电源应用而设计。下面我将基于您提供的信息&#xff0c;对H6922的特性和典型应用进行更详细的解释。 产品特性详解 宽输入电压&#xff1a;H6922支持2.8-40V的宽输入电压范围…

【Windows】Visual Studio Installer下载缓慢解决办法

【Windows】Visual Studio Installer下载缓慢解决办法 1.背景2.分析3.结果 1.背景 使用visual studio在线安装包进行IDE安装&#xff0c;发现下载几乎停滞&#xff0c;网速几乎为零。 经过排查并不是因为实际网络带宽导致。 这里涉及DNS知识&#xff1b; DNS&#xff08;Dom…

SCI丨5分期刊,JCR一区

SCI&#xff0c;5分&#xff0c;JCR Q1&#xff0c;中科大类3小类2区 1 基于复杂网络与xxx能源汽车节能数值分析 2 基于热能损失优化的xxx与性能管理 3 基于xxxLCA技术的绿色制造工艺优化研究 4 基于xxx入侵检测技术的物联网智能制造监控系统设计 6 基于物联网技术xxx电力系…

BMP280 环境传感器

型号简介 BMP280是博世&#xff08;bosch-sensortec&#xff09;的一款气压传感器&#xff0c;特别适用于移动应用。其小尺寸和低功耗使其能够应用于电池供电的设备&#xff0c;如手机、GPS 模块或手表。基于博世久经考验的压阻式压力传感器技术&#xff0c;具有高精度和线性度…

Elasticsearch备份数据到本地,并导入到新的服务 es 服务中

文章目录 使用elasticsearch-dump工具备份安装node.js(二进制安装)解压设置环境变量安装elasticsearch-dump docker安装使用ES备份文件到本地 使用elasticsearch-dump工具备份 这个工具备份时间比较长 安装node.js(二进制安装) wget https://nodejs.org/dist/v16.18.0/node-…

SpringBoot: Eureka入门

1. IP列表 公司发展到一定的规模之后&#xff0c;应用拆分是无可避免的。假设我们有2个服务(服务A、服务B)&#xff0c;如果服务A要调用服务B&#xff0c;我们能怎么做呢&#xff1f;最简单的方法是让服务A配置服务B的所有节点的IP&#xff0c;在服务A内部做负载均衡调用服务B…

基于FPGA的DDS信号发生器

前言 此处仅为基于Vivado实现DDS信号发生器的仿真实现&#xff0c;Vivado的安装请看下面的文章&#xff0c;这里我只是安装了一个标准版本&#xff0c;只要能够仿真波形即可。 FPGA开发Vivado安装教程_vivado安装 csdn-CSDN博客 DDS原理 DDS技术是一种通过数字计算生成波形…

图解 Kafka 架构

写在前面 Kafka 是一个可横向扩展&#xff0c;高可靠的实时消息中间件&#xff0c;常用于服务解耦、流量削峰。 好像是 LinkedIn 团队开发的&#xff0c;后面捐赠给apache基金会了。 kafka 总体架构图 Producer&#xff1a;生产者&#xff0c;消息的产生者&#xff0c;是消息的…

排序算法系列一:选择排序、插入排序 与 希尔排序

目录 零、说在前面 一、理论部分 1.1&#xff1a;选择排序 1.1.1&#xff1a;算法解读&#xff1a; 1.1.2&#xff1a;时间复杂度 1.1.3&#xff1a;优缺点&#xff1a; 1.1.4&#xff1a;代码&#xff1a; 1.2&#xff1a;插入排序 1.2.1&#xff1a;算法解读&#x…

上位机图像处理和嵌入式模块部署(mcu 项目1:上位机编写)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面&#xff0c;我们说过要做一个报警器。如果只是简单做一个报警器呢&#xff0c;这个基本上没有什么难度。这里&#xff0c;我们就适当提高一下…

某业帮六月校招后端笔试

题目一 解题思路 签到题&#xff0c;dp就行。 题目二 解题思路 这个比较烦人&#xff0c;需要处理额外的引号和括号。用DFS&#xff0c;对于每个间隙&#xff0c;插入与不插入都搜一遍。 题目三 解题思路&#xff1a; 双指针&#xff0c;左右各一个指针&#xff0c;对比长度&…

如何在Python中拷贝类对象到数组

1、问题背景 在Python中&#xff0c;我们经常需要存储多个对象的集合。有时&#xff0c;我们需要拷贝这些对象&#xff0c;以便在不修改原始对象的情况下对它们进行操作。例如&#xff0c;在下述代码中&#xff0c;我们在colors列表中存储了多个Color对象&#xff0c;然后我们创…

单线激光雷达-多线激光雷达安装测试

单线激光雷达思岚 S 系列 参数简介 单线激光雷达的参数&#xff0c;主要看扫描频率&#xff08;Hz&#xff09;&#xff0c;扫描范围&#xff08;度&#xff09;&#xff0c;最大测距距离&#xff08;m&#xff09;以及单 圈点数&#xff09;。机器人运动速度越快&#xff0c…

Windows系统安装NVM,实现Node.js多版本管理

目录 一、前言 二、NVM简介 三、准备工作 1、卸载Node 2、创建文件夹 四、下载NVM 五、安装NVM 六、使用NVM 1、NVM常用操作命令 2、查看NVM版本信息 3、查看Node.js版本列表&#xff1b; 4、下载指定版本Node.js 5、使用指定版本Node.js 6、查看已安装Node.js列…

《后端程序猿 · 基于 Lettuce 实现缓存容错策略》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;如需交流&#xff…