C# 数据校验与控件绑定

news2024/9/27 9:22:12
在上一篇中,写了使用特性对一个对象的值进行校验;虽然代码比较简单,但依然不是最优解,在做数据新增校验的时候,倒也没什么问题,毕竟这是WinForm;但是如果是做数据编辑,代码就会变得更冗余,特别是在控件比较多的情况下。

所以这一篇其实是引用了控件的DataBindings属性来做优化。

实现功能:

- 使用控件的DataBindings属性简化数据验证

开发环境:

开发工具: Visual Studio 2013

.NET Framework版本:4.5

如果按照上一篇的思路来写编辑页面的话,可能会是下面这个样子:

public Model model = new Model
{
Name = "张三",
Age = 10,
mail = "111"
};
public Form2()
        {
            InitializeComponent();
        }
private void Form2_Load(object sender, EventArgs e)
        {
            txt_name.Text = model.Name;
            txt_age.Text = model.Age+"";
            txt_mail.Text = model.mail;
        }
private void button1_Click(object sender, EventArgs e)
  {
      Model model = new Model
            {
                Name = txt_name.Text,
                Age = int.Parse(txt_age.Text),
                mail = txt_mail.Text
                };
      string msg = model.Validate();
      if (!string.IsNullOrWhiteSpace(msg))
            {
                MessageBox.Show(msg);
            }
      else
            {
                MessageBox.Show("验证通过");
            }
  }

发现什么问题了吗?对控件进行了来回的赋值以及取值,在当有数十个控件的时候,代码可能就已经惨不忍睹了。

所以,这里我们就使用控件的DataBindings属性来优化一下这个情况。

本着能少写一行代码就少写一行的思想,此处还是要实现一个扩展方法,主要是把DataBindings进行一下简单的封装,能在调用的时候少写几个字母。。。

 public static class ControlEx
    {
        public static void BindText(this Control control, object dataSource, string dataMember)
        {
            control.DataBindings.Add("Text", dataSource, dataMember, false, DataSourceUpdateMode.OnPropertyChanged);
        }
    }

然后再来看看页面的实现

public Model model = new Model
{
Name = "张三",
Age = 10,
mail = "111"
};
public Form2()
        {
            InitializeComponent();
        }
private void Form2_Load(object sender, EventArgs e)
        {
            txt_name.BindText(model, "Name");
            txt_age.BindText(model, "Age");
            txt_mail.BindText(model, "Mail");
        }

private void button1_Click(object sender, EventArgs e)
        {
            string msg = model.Validate();
            if (!string.IsNullOrWhiteSpace(msg))
            {
                MessageBox.Show(msg);
            }
            else
            {
                MessageBox.Show("验证通过");
            }
        }

怎么样?是不是简洁清爽了好多?再多的控件,也只需要进行一次绑定即可,数据源的值随着控件值变化而变化。

可能这里又会继续想到下一个问题,能不能让绑定也变得更简单呢?毕竟几十个控件就几十行代码,也是很麻烦。好吧,其实这里的麻烦是比较难省略的,只是我们可以把麻烦转移到其他地方,然后使用循环来实现这个效果。下一篇来写下实现代码。

实现效果:

由简入繁,拿来即用

更多精彩,请持续关注公众号:

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

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

相关文章

遗忘的数学(拉格朗日乘子法、牛顿法)

目录 拉格朗日乘子法定理 证明:​编辑 应用条件与符号选择 雅可比矩阵 黑塞矩阵 牛顿法 解方程的根的牛顿法 解方程组的根的牛顿法 数值优化的牛顿法(求最值) 拉格朗日乘子法定理 证明: dSi这一段没看懂…… 应用…

“AI+Security”系列第3期(四):360安全大模型业务实践

近日,由安全极客、Wisemodel 社区、InForSec 网络安全研究国际学术论坛和海升集团联合主办的“AI Security”系列第 3 期技术沙龙:“AI 安全智能体,重塑安全团队工作范式”活动顺利举行。此次活动吸引了线上线下超过千名观众参与。 活动中&…

C++——关联式容器(5):哈希表

7.哈希表 7.1 哈希表引入 哈希表的出现依旧是为了查找方便而设计的。在顺序结构中,查询一个值需要一一比较,复杂度为O(N);在平衡树中,查询变为了二分查找,复杂度为O(logN);而对于哈希表,我们可…

BST-二叉搜索树

前言 从图的角度出发,树是一种特殊的图。图的大多数算法,树都可以适用。对树操作中,你可以发现有关图算法思想的体现。 不过, 本篇不是完全从图的角度解读树, 重点在初学者视角(一般学习数据结构顺序是从树…

码点和码元的区别--Unicode标准的【码点】和【码元】

Unicode是通用字符编码标准是计算机科学领域里的一项业界标准,包括字符集、编码方案等。 Unicode标准定义了一个统一的多语言文本字符集(即Unicode字符集)。 Unicode标准定义了三种字符编码方案:UTF-8、UTF-16、UTF-32。 因此&…

【Java面向对象高级06】static的应用知识:代码块

文章目录 前言一、代码块概述二、代码块分2种 1、静态代码块2、实例代码块总结 前言 记录static的应用知识:代码块 一、代码块概述 代码块是类的5大成分之一(成员变量,构造器,方法,代码块,内部类&#xf…

「Python教程」vscode的安装和python插件下载

粗浅之言,如有错误,欢迎指正 文章目录 前言Python安装VSCode介绍VSCode下载安装安装python插件 前言 Python目前的主流编辑器有多个,例如 Sublime Text、VSCode、Pycharm、IDLE(安装python时自带的) 等。个人认为 vscode 虽然在大型项目上有…

一个好用的MP3音乐下载网,我推荐给你(免费)

点击访问->https://www.gequbao.com/ 或用Bing搜索歌曲宝即可。 主页面长这样子~ 以最近大火的悲鸣海为例,搜索; 以第一个为例,点击; 它既支持下载.mp3格式的音乐文件,还支持下载.lrc的歌词文件。 非常好用&…

使用ChatGPT引导批判性思维,提升论文的逻辑与说服力的全过程

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 批判性分析(Critical Analysis) 是论文写作中提升质量和说服力的重要工具。它不仅帮助作者深入理解和评价已有研究,还能指导作者在构建自己论点时更加…

网络工程师学习笔记——网络互连与互联网(三)

TCP三次握手 建立TCP连接是通过三次握手实现的,采用三报文握手主要是为了防止已失效的连接请求报文突然又传送到了,因而产生错误 主动发起TCP连接建立的称为客户端 被动等待的为TCP服务器,二者之间需要交换三个TCP报文段 首先是客户端主动…

jQuery——对象的使用

1、理解:即执行 jQuery 核心函数返回的对象 2、jQuery 对象内部包含的是 dom 元素对象的伪数组(可能只有一个元素) 3、jQuery 对象是一个包含所有匹配的任意多个 dom 元素的伪数组对象 4、基本行为: ① size(&#xf…

Java_Se 数组与数据的存储

数组是相同类型数据的有序集合。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。 数组的四个基本特点: 1.长度是确定的。数组一旦被创建,它的大小就是不可以改变的。 2.其元素…

【Java 问题】基础——面相对象

面向对象 15. 面向对象和面向过程的区别?16. 面向对象的基本特征17.重载(overload)和重写(override)的区别?18.访问修饰符public、private、protected、以及不写(默认)时的区别&…

2024低代码大赛火热进行,豪礼抢先看~

2024 网易低代码大赛正火热进行中,其中“网易云信低代码”专区吸引了众多开发者参与。 通过低代码高效、灵活的应用构建方式,结合云信的即时通讯和音视频能力,开发者既可以大幅缩短开发周期,还能提升应用的互动性和用户体验。 为…

AGV小车全双工通信应用-低延迟、8路并发全双工通信

随着智能制造和物流行业的不断发展,AGV小车(自动导引车)在工厂、仓库、物流中心的应用日益广泛。AGV小车凭借其自动化、高效、灵活的特点,逐渐成为物料搬运中的关键设备。在这种复杂多变的环境中,数据传输的可靠性、实…

支持云边协同的「物联网平台+边缘计算底座」

2024年9月20日,工信部发布《工业重点行业领域设备更新和技术改造指南》,旨在指导工业领域设备更新和技术改造工作。该指南设定目标,到2027年完成约200万套工业软件和80万台工业操作系统的更新换代任务。此外,计划实现80%规模以上制…

Python3自带HTTP服务:轻松开启与后台管理

Python3自带有http服务,可以在服务器,也可以在本地启动,并运行一些常用的网页程序。比如:我们可以把streamlit框架编写的网页放到服务器上,开启http服务,就可以通过网页来调用这个pythont程序了&#xff0c…

14、线程池ForkJoinPool实战及其工作原理分析

1. 由一道算法题引发的思考 算法题:如何充分利用多核CPU的性能,快速对一个2千万大小的数组进行排序? 1)首先这是一道排序的算法题,而且是需要使用高效的排序算法对2千万大小的数组进行排序,可以考虑使用快…

重头开始嵌入式第四十二天(硬件 ARM体系架构)

目录 一,ARM是什么? 1.公司名称 ARM的主流架构: 2.处理器架构 二,什么是处理器架构?什么是处理器? 一、处理器 二、处理器架构 三,一个计算机由什么构成呢? 一、硬件系统 二…

SDK3(note上)

搞了举个窗口设置还有鼠标处理的信息 注释写在代码中了 #include <windows.h> #include<tchar.h> #include <stdio.h> #include <strsafe.h>/*鼠标消息 * 键盘消息 快捷键消息 菜单消息 控件消息 自定义消息 窗口消息 客户区域的概念(Client Aera) 非…