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(16)]
        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 绑定可空类型遇见的问题。

posted @   sims  阅读(553)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示