日期和时间编辑有问题

本文关键字:有问题 编辑 时间 日期 | 更新日期: 2023-09-27 18:05:04

下面是我的代码:

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);
} 

如果我从小时数中删除一个数字,那么它可以正常工作,但是如果我删除两个数字,例如我想从11更改为22,那么它就会崩溃。那么我如何使形式"yyyy-MM-dd H:m:s"适用于所有情况呢?谢谢!

日期和时间编辑有问题

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

基本上,当用户在编辑时,你不应该期望这个值总是有效的——就像我在编辑代码时,它不会总是语法正确。

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

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

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

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

您可以从使用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);
} 

你不应该期望在用户编辑的时候这个值总是有效的——就像我在编辑代码的时候,它不会总是语法正确的。

这段代码需要放在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作为选择日期和时间的更友好的方式。

因为它是在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放在不同的事件上。