如何绑定Nullable数据类型

zhujiawei7 2012-11-03 06:15:17
textBox1.DataBindings.Add("Text", this.dataSource, "Name");
通过以上代码可以将一个实体的属性绑定到textBox1控件上,但是不能绑定Nallable类型的属性。
比如:

public bool? IsActive{get;set;}
public DateTime? CreateTime{get;set;}

这种带问号的Nallable数据类型无法绑定,不知道要怎么处理?
...全文
264 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hauk 2012-11-04
  • 打赏
  • 举报
回复
        class TestObj
        {
            public DateTime? Birthday { get; set; }
            public bool? IsMan { get; set; }
            public double? Age { get; set; }
            public string Name { get; set; }
        }
        private TestObj to;
        private Binding bind;
        private void Form4_Load(object sender, EventArgs e)
        {
            to = new TestObj();
            to.Birthday = null;
            bind = new Binding("Value", to, "Birthday");

            //bind.ControlUpdateMode = ControlUpdateMode.OnPropertyChanged;
            //bind.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
            //textBox1.DataBindings.Add(bind);

            bind.FormattingEnabled = true;//设置允许格式化
            bind.NullValue = DateTime.Now.AddDays(100);//如果绑定的属性为空值就取这一个
            //bind.DataSourceNullValue = DateTime.Now;
            this.dateTimePicker1.DataBindings.Add(bind);
        }
设置允许格式化,和NullValue 就可以了。 我之前测试的都是文本框的绑定,由于它的属性Text需要的是一个string所以无论怎么设值都没问题的。 你这儿绑定的属性Value,需要的是一个DateTime类型的,所以存在一个类型转换的问题。
zhujiawei7 2012-11-04
  • 打赏
  • 举报
回复
引用 8 楼 haukwong 的回复:
引用 6 楼 sp1234 的回复: 引用 4 楼 haukwong 的回复:各种类型都试了,都可以绑定成功的。不知道你那儿是个什么情况。 为什么不用null值测试呢? null也试过的,都没有问题。 我觉得还是要看看LZ是什么样的应用场景。
能把你的NUll代码贴出来,让我看下嘛
zhujiawei7 2012-11-03
  • 打赏
  • 举报
回复
我是winform .net4,我的测试代码

public class Person
    {
        public DateTime? CreateTime { get; set; }
    }

Person person = new Person();
dateTimePicker1.DataBindings.Add("Value", person, "CreateTime");
报“System.FormatException: 无法将值格式化为所需的类型。”
Hauk 2012-11-03
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
引用 4 楼 haukwong 的回复:各种类型都试了,都可以绑定成功的。不知道你那儿是个什么情况。 为什么不用null值测试呢?
null也试过的,都没有问题。 我觉得还是要看看LZ是什么样的应用场景。
zhujiawei7 2012-11-03
  • 打赏
  • 举报
回复
既然为Nullable,DateTime?当然可以为null了,楼上的属性都有值不会报错。 为null时,报“System.FormatException: 无法将值格式化为所需的类型。” 这个问题要如何解决?
  • 打赏
  • 举报
回复
引用 4 楼 haukwong 的回复:
各种类型都试了,都可以绑定成功的。不知道你那儿是个什么情况。
为什么不用null值测试呢?
  • 打赏
  • 举报
回复
引用 楼主 zhujiawei7 的回复:
textBox1.DataBindings.Add("Text", this.dataSource, "Name"); 通过以上代码可以将一个实体的属性绑定到textBox1控件上,但是不能绑定Nallable类型的属性。 比如: C# code123public bool? IsActive{get;set;}public DateTime? CreateTime……
无法处理。 应该绑定另外一个取值不会抛出异常的属性或者方法。
Hauk 2012-11-03
  • 打赏
  • 举报
回复
        class TestObj
        {
            public DateTime? Birthday { get; set; }
            public bool? IsMan { get; set; }
            public double? Age { get; set; }
            public string Name { get; set; }
        }
        private TestObj to;
        private void Form4_Load(object sender, EventArgs e)
        {
            to = new TestObj { Name = "zhangsan", Age = 20.5, IsMan = false, Birthday = DateTime.Now };
            textBox1.DataBindings.Add("Text", to, "Birthday");
        }
各种类型都试了,都可以绑定成功的。不知道你那儿是个什么情况。
机器人 2012-11-03
  • 打赏
  • 举报
回复
无法绑定是什么现象呢?绑定Text(Fw直接帮你转成String,就算是null也没问题)

 var data = new List<TestObj> { 
     new TestObj { Date = null },
     new TestObj { Date = DateTime.Now }
 };

 this.dataGridView1.DataSource = data;
 //this.dataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing;

 this.textBox1.DataBindings.Add("Text", this.dataGridView1.DataSource, "Date");
 this.dateTimePicker1.DataBindings.Add("Text", this.dataGridView1.DataSource, "Date");
zhujiawei7 2012-11-03
  • 打赏
  • 举报
回复
引用 1 楼 haukwong 的回复:
C# code 12345678910111213141516171819 class TestObj { public int? Age { get; set; } public string Name { get; set; } } public partial class Form4 : Form {……
是的,int?正常。你可以试试bool? DateTime?
Hauk 2012-11-03
  • 打赏
  • 举报
回复
    class TestObj
    {
        public int? Age { get; set; }
        public string Name { get; set; }
    }
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
        }

        private void Form4_Load(object sender, EventArgs e)
        {

            TestObj to = new TestObj { Age = 10, Name = "zhangsan" };
            this.textBox1.DataBindings.Add("Text", to, "Age");
        }
    }
我试了一下,怎么一切正常呢?弹出界面后,文本框正常显示:10

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧