找回密码
 立即注册

QQ登录

只需一步,快速开始

zhata
论坛元老   /  发表于:2012-12-14 14:02  /   查看:10272  /  回复:9
如何让DateTimePickerCell返回的值只有日期,不包含时间
DateTimePickerCell的日期格式无论如何设置,当将控件中的值清空后再选一个日期,返回的值总是会包含有时间信息。
有没有属性能让它始终返回的值只有日期没有时间。补充一点,看见显示的是日期,但代码中的值确包含的时间。

9 个回复

倒序浏览
wedy.wang
初级会员   /  发表于:2012-12-17 14:40:00
沙发
回复 1楼zhata的帖子

你可以将从代码当中获取的Value转换成一个DateTime类型的值,然后自己处理这个DateTime类型的值,比如使用它的DateTime.ToShortDateString()。
回复 使用道具 举报
zhata
论坛元老   /  发表于:2012-12-18 13:24:00
板凳
上帝啊,这得多大的工作量啊,在一个系统中日期字段太多了,一不留神就出错了,在开发的时候还看不出来,要到汇总统计时才会发现。一般日期字段都是与表字段邦定的,然后通过日期格式控制返回值,如果要在每个日期字段中添加代码来转换,那不敢想象代码有多臃肿,工作量有多大。求你们去反映反映出一个补丁程序,其实在日期字段为空白时默认值不要返回Now(),而是返回Today()就能解决这个问题或者显示Null值指定的值也可以。 (注:这个问题太离谱了,最大的问题是用户发现日期中包含时间后根本无法通过原有的输入窗口把时间去掉,已经存盘的数据根本无法改正。)
回复 使用道具 举报
wedy.wang
初级会员   /  发表于:2012-12-18 14:21:00
地板
回复 3楼zhata的帖子

我想再确认一下,你是否想要的结果是一个短日期的DateTime类型的对象,这个对象的Time字段是12:00:00?比如:2012/12/18 14:10:00 变成 2012/12/18 12:00:00
因为DateTime类型的的对象的Date属性是带时间的。
你可以处理GcMultiRow.CellParsing事件,将Cell的值改成你实际想要的:
  1. void gcMultiRow1_CellParsing(object sender, CellParsingEventArgs e)
  2.         {
  3.             if (e.Scope == CellScope.Row && e.CellName == "dateTimePickerCell1")//DateTimePickerCell
  4.             {
  5.                 if (e.Value != null)
  6.                 {
  7.                     DateTime value = (DateTime)e.Value;
  8.                     e.Value = value.Date;
  9.                 }
  10.             }
  11.         }
复制代码
回复 使用道具 举报
zhata
论坛元老   /  发表于:2012-12-18 14:47:00
5#
回复 4楼wedy.wang的帖子

我要的是2012/12/18 00:00:00,你这个是能够解决一些问题,但是很容易出现遗漏。很难保证所有的日期都得到正确的处理,没有人能发现日期存盘有错误,直到出统计报表时才会看到错误,其实统计报表中也看不出来,只是觉得奇怪相同日期不会汇总到一起。最好还是出一个补丁程序,对所有使有该控件的客户都是需要的。
回复 使用道具 举报
wedy.wang
初级会员   /  发表于:2012-12-18 15:28:00
6#
回复 5楼zhata的帖子

目前只能提供这样的workaround。如果你希望Cell的值为Null时,有个默认的值,你可以设置dateTimePickerCell.Style.NullValue=DateTime.Today。
》我要的是2012/12/18 00:00:00
在我的英文操作系统下面,DateTime.Today会返回“2012/12/18 12:00:00 Am”

感谢你的反馈,我们会考虑你的建议。
回复 使用道具 举报
zhata
论坛元老   /  发表于:2012-12-18 15:57:00
7#
Cell的值为Null时显示空白符合程序要求。关键是dateTimePickerCell在操作员将值清除后重新选择日期,dateTimePickerCell.Value的值无法正确返回日期,它总是会返回带时间的日期,如果不清除为空白它总是能返回不带时间的日期。而且在日期格式为:YYYY-MM-DD无论再怎么操作也是无法改正的。这种错误是无法容忍的,跟我们在购买该控件时合同中规定你们不提供升级程序无关。对这种低级错误不但要免费提供升级程序,而且速度要快。恳请你们将这个错误反映给相关的领导,能考虑尽快出一个补丁程序。Windows那么复杂有问题还出补丁程序。
回复 使用道具 举报
wedy.wang
初级会员   /  发表于:2012-12-24 12:16:00
8#
回复 7楼zhata的帖子

请问:处理CellParsing事件无法解决你的问题吗?

  1.             if (e.Scope == CellScope.Row && e.CellIndex == 0)//DateTimePickerCell
  2.             {
  3.                 if (e.Value != null)
  4.                 {
  5.                     DateTime value = (DateTime)e.Value;
  6.                     e.Value = value.Date;
  7.                 }
  8.             }
复制代码


如果你使用我们提供的CellParsing事件,就可以将选择的值剔除掉Time信息。
另外,目前的表现是我们的设计,你也可以尝试.net framework的DateTimePicker控件,将他的Format属性设置为Short,再获取他的Value,你会发现,他也包含时间信息。这个Format属性的本质是“显示”成什么样子,而不是存储成什么样子,这是两个概念。而我们的CellParsing事件就是用来定制实际存储的Value的。
回复 使用道具 举报
zhata
论坛元老   /  发表于:2013-1-25 14:02:00
9#
.net framework的DateTimePicker控件,将他的Format属性设置为Short,再获取他的Value,你会发现,他也包含时间信息。
关于这个问题我以前就试过了,结果如下:
如果你不给他初始化值或给它的是包含时间的初始化值是这样的,但如果给了不包含时间初始化值以后,以后无论怎么操作都不会返回有时间的日期。
DateTimePickerCell行为跟.net framework的DateTimePicker控件之所以不一样是因为:当用户将日期清空之后,DateTimePickerCell会自动将Now()作为默认值(注:这是帮助文档里这么说的),这样就出问题了,如果.net framework的DateTimePicker控件给它的初始化值包含的时间以后,它返回的值就会一直包含有时间。所以DateTimePickerCell返回的日期就会一直包含时间。
回复 使用道具 举报
wedy.wang
初级会员   /  发表于:2013-2-21 09:36:00
10#
非常抱歉,回复的有些晚了。
>当用户将日期清空之后,DateTimePickerCell会自动将Now()作为默认值(注:这是帮助文档里这么说的)
MultiRow有个策略就是当用户把日期值清空之后,他会将DateTImePickerCell.Style.NullValue作为他的显示值,如果NullValue没有设置,他会自动将Now()作为默认值。因此为了解决你的问题,其实你只需要将DateTImePickerCell.Style.NullValue设置为Today()就可以了,下一次选择日期之后,你会发现时间信息就不会有了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部