日期和时间编辑有问题

时间:2015-07-27 06:46:08

标签: c# datetime

这是我的代码:

canvas

如果我从小时删除1个号码,那么它可以正常工作,但如果我删除两个号码e.x.我想从11改为22然后它崩溃了。那么如何让表格private void textBox1_TextChanged(object sender, EventArgs e) { DateTime myDate = DateTime.ParseExact(textBox1.Text, "yyyy-MM-dd H:m:s", System.Globalization.CultureInfo.InvariantCulture); TimeChangedHandler(myDate); } 适用于所有情况?谢谢!

4 个答案:

答案 0 :(得分:2)

如果您想表明日期/时间无效,请使用DateTime.TryParseExact 检查是否有效,而不会抛出异常。使用返回值(true / false)来确定有效性。

基本上,在用户编辑时,您不应期望该值始终有效 - 就像我编辑代码时一样,它不会总是在语法上正确。

当您实际使用值时,您需要检查它是否有效 - 在此之前,可能只需添加一个可视标记来表明它无效。

您可能想要考虑一下,只要提供的日期/时间有效,您的TimeChangedHandler(无论是什么)都应该隐式触发,或者您的UI是否应该提供更明确的"使用此值&#34 34;动作(例如按钮)。

另外,请考虑使用DateTimePicker作为选择日期和时间的更友好方式。

最后,我个人避免使用H:m:s的模式...日期部分看起来像ISO-8601,所以我建议使用HH:mm:ss完成有效性 - 例如,2015-07-27 7:55:5的值是奇数(IMO)。

答案 1 :(得分:0)

您可以使用DateTime.TryParse方法检查日期的两种格式:

private void textBox1_TextChanged(object sender, EventArgs e)
{
     DateTime myDate = default(DateTime);
     if(!DateTime.TryParseExact(textBox1.Text, "yyyy-MM-dd H:m:s",
     System.Globalization.CultureInfo.InvariantCulture, out myDate))
       DateTime.TryParseExact(textBox1.Text, "yyyy-MM-dd HH:mm:ss",
         System.Globalization.CultureInfo.InvariantCulture, out myDate)     

     if(myDate == default(DateTime)) return; // or
      // throw new ArgumentException("your text here");

     TimeChangedHandler(myDate);
} 

答案 2 :(得分:0)

在用户编辑时,您不应期望该值始终有效 - 就像我编辑代码时一样,它不会始终在语法上正确。

这个代码需要放在try catch中,因为你想要像这样的灵活值

private void textBox1_TextChanged(object sender, EventArgs e)
{
          try
          {
     DateTime myDate = DateTime.ParseExact(textBox1.Text, "yyyy-MM-dd H:m:s",System.Globalization.CultureInfo.InvariantCulture);
     TimeChangedHandler(myDate);
          }
         catch (Exception ex)
         {}
} 

因此,如果用户输入的值不正确并考虑使用DateTimePicker作为选择日期和时间的更友好方式,则不会爆炸。

答案 3 :(得分:-1)

由于它位于TextChanged事件处理程序上,您可能希望在实时编辑过程中尝试添加try...catch处理。

try
{
    DateTime myDate = DateTime.ParseExact(textBox1.Text, "yyyy-MM-dd H:m:s",
    System.Globalization.CultureInfo.InvariantCulture);

    TimeChangedHandler(myDate);
}catch( Exception ex )
{
    //Catch exception
}

虽然更好的解决方案是将其置于不同的事件上。灵活的编辑是否意味着实时编辑?如果是,在此期间将文本从11更改为22可能会导致格式发生变化,因此ParseExact最好放在不同的事件上。