Winform TextBox 数据绑定空值校验问题
问题:
using System;
using System.ComponentModel.DataAnnotations; public class Cost
{
/// <summary>
/// 成本
/// </summary>
/// <value></value>
[Display(Name = "成本")]
public float? Cost { get; set; } /// <summary>
/// 成本2
/// </summary>
/// <value></value>
[Display(Name = "成本2")]
public float? Cost2 { get; set; } /// <summary>
/// 成本3
/// </summary>
/// <value></value>
[Display(Name = "成本3")]
public float? Cost3 { get; set; } /// <summary>
/// 成本4
/// </summary>
/// <value></value>
[Display(Name = "成本4")]
public float? Cost4 { get; set; } /// <summary>
/// 成本货币符号
/// </summary>
/// <value></value>
[Display(Name = "成本货币符号")]
[StringLength()]
public string CostCurrencySymbol { get; set; }
}
需要把上面这个类的数据绑定到以下界面:

四个成本字段分别绑定到四个 TextBox Text 属性,使用以下代码添加绑定:
1. 最开始只是简单的绑定
Binding costBinding = new Binding("Text", saleProductCodeDetail, nameof(saleProductCodeDetail.Cost);
costBinding.DataBindings.Add(costBinding);
使用该方法,我们可以往 TextBox 输入数据,甚至可以输入字母及文字,但是鼠标离开 TextBox 时,TextBox 内容会自动消失。
原因分析:由于我们把 float? 类型绑定到 Text 属性,Text 属性类型是字符串类型,而我们在这里只是简单的调用了数据绑定,而输入的文本并不会被自动格式化为绑定的数据类型,因此我们在绑定数据时,需要调用带有格式化参数的重载方法:
Binding costBinding = new Binding("Text", saleProductCodeDetail, nameof(saleProductCodeDetail.Cost, true);
costBinding.DataBindings.Add(costBinding);
使用以上方法可以保证数据输入后,当数据离开 TextBox 后内容不会消失,并且输入字母或者文字后,光标无法离开当前 TextBox。
2. 解决删除已有数据后光标无法离开 TextBox
上面的方法解决了输入内容后消失的问题,但是有一个问题:当把文本框中的已有的数字删除后,光标无法离开 TextBox
原因分析:当我们把已有数据删除后,文本内容变为 "",而字符串并不会被自动解析为 null 赋值到模型数据,所以这里需要添加转换的方法。
查了半天找到了解决方法:
https://bbs.csdn.net/topics/220010265#new_post
给 Binding 添加 Parse 事件:
costBinding.Parse += CostBinding_Parse; private void CostBinding_Parse(object sender, ConvertEventArgs e)
{
Binding binding = (Binding)sender;
if (e.Value.ToString() == "")
{
e.Value = null;
}
}
以上是参考上面链接的方法,但是链接中转换的时候是 e.Value = DBNull.Value; 怎么也不好使,我们想一下,e.Value的类型是 float? 而我们如果赋值一个 DBNull.Value 的话并不是 null,所以赋值的话并不是 null。这个地方卡了很久。
3. 我们还可以添加格式化事件
当模型的数据为 null 时,我们可以把 TextBox 的 Text 设置为 ""
costBinding.Format += CostBinding_Format; private void CostBinding_Format(object sender, ConvertEventArgs e)
{
Binding binding = (Binding)sender;
if (e.Value == null)
{
e.Value = "";
}
}
以上是解决 TextBox 绑定可空类型遇见的问题。
Winform TextBox 数据绑定空值校验问题的更多相关文章
- .net WinForm 的数据绑定
.net WinForm 的数据绑定相当灵活 http://www.cnblogs.com/ydong/archive/2006/04/22/381847.html 原来只知道 Control 类上的 ...
- winform textbox 的自动实现功能
好久没写博客了,主要是太懒了,之前因为做bs的比较多现在想转cs端了,虽然现在做cs也一年了,可接触的东西太过零碎了,以至于感觉这一年好像什么都没有学到.估计是因为学了之后没有记录,不扎实,然后又忘记 ...
- winform treeView 数据绑定
转载:http://www.jetwu.cn/archives/737 winform treeView 数据绑定 private void Form1_Load(object sender, Eve ...
- WinForm TextBox 焦点停留到文本最后
最近写个 WinForm 项目,TextBox 控件有内容的时候,获取焦点,光标总是在最前面,很不便于输入.那怎么样让光标停留到最后呢?如下代码可以实现: this.txtBox ...
- WinForm TextBox自定义扩展方法数据验证
本文转载:http://www.cnblogs.com/gis-crazy/archive/2013/03/17/2964132.html 查看公司项目代码时,存在这样一个问题:winform界面上有 ...
- C#:TextBox数据绑定
经常写用一个TextBox显示某个对象,然后编辑之后再保存的程序.以前都是在TextBox_TextChanged事件中修改对象的值,或者保存的时候再读取TextBox.Text属性保存对象的值.这样 ...
- Winform Textbox控件字体垂直居中
项目中遇到要求Textbox内的字体垂直居中的问题,在网上找一直没有理想的解决方案.后来发现可以通过设置控件的字体来达到预期的效果. 默认的Textbox的Font属性为 “宋体, 9pt”,效果如下 ...
- Winform TextBox中只能输入数字的几种常用方法(C#)
方法一: private void tBox_KeyPress(object sender, KeyPressEventArgs e) { ; //禁止空格键 )) return; //处理负数 if ...
- Winform Textbox MultiLine和WordWrap属性的使用
突然用到,有些不明白,零乱记录下: 1.MultiLine属性为True时,Dock属性Fill值才能达到所需效果 2.MultiLine属性为False时,WordWrap属性也是无效果的,同1,T ...
随机推荐
- 我还在生产玩 JDK7,JDK 15 却要来了!|新特性尝鲜
自从 JDK9 之后,每年 3 月与 9 月 JDK 都会发布一个新的版本,而2020 年 9 月即将引来 JDK15. 恰巧 IDEA 每四五个月会升级一个较大的版本,每次升级之后都会支持最新版本 ...
- 033_go语言中的打点器
代码演示 package main import "fmt" import "time" func main() { ticker := time.NewTic ...
- javascript逻辑运算与循环笔记
短路运算(逻辑中断) 1.短路运算的原理:当有多个表达式(值)时,左边的表达式值可以确定结果的时候就不再继续运算右边的表达式的值 2.逻辑与 && 如果 ...
- MyBatisPlus性能分析插件,条件构造器,代码自动生成器详解
性能分析插件 我们在平时的开发中,会遇到一些慢sql,测试,druid MP(MyBatisPlus)也提供性能分析插件,如果超过这个时间就停止 不过官方在3.2版本的时候取消了,原因如下 条件构造器 ...
- 2020-05-26:TCP四次挥手过程?
福哥答案2020-05-26:
- 2020-04-09:TCP的四次挥手中为什么要有TIME_WAIT状态?
TIME_WAIT状态存在有两个原因.<1>可靠终止TCP连接.如果最后一个ACK报文因为网络原因被丢弃,此时server因为没有收到ACK而超时重传FIN报文,处于TIME_WAIT状态 ...
- C#LeetCode刷题之#39-组合总和(Combination Sum)
目录 问题 示例 分析 问题 该文章已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3663 访问. 给定一个无重复元素的数组 candi ...
- BLE MESH 学习[1] - ESP32 篇
BLE MESH 学习 BLE MESH 是一种蓝牙(n:m)组网的技术. 本篇先介绍 BLE MESH 到使用 ESP32 的官方示例对其进行学习讲解. 后面会进一步学习 SIG 的 BLE MES ...
- G4560 HD610安装黑苹果Hakintosh
这一篇主要是写给使用G4560笔记本折腾黑苹果的朋友. 我折腾了几天黑苹果,发现怎么也无法成功,最后我才知道HD610现在还不支持黑苹果. 由于大多数笔记本不支持屏蔽核显,这意味着要想使用黑苹果必须要 ...
- day12 异常 模块 单例
1.异常 处理 在程序执行过程中 ,发生,影响程序的正常运行 在python中 异常就是一个错误 try .... except....捕获异常 try 用来检测t ...