C#WPF检查文本框中的文本是否为有效日期

时间:2015-10-10 15:56:05

标签: c# wpf

我试图通过一些验证做一个表单但是我遇到了DateTime

的问题

这是我的Person.cs

private string dateBirth;

public string DateBirth
    {
        get { return dateBirth; }
        set
        {
            if (string.IsNullOrEmpty(value) == true)
            {
                throw new ArgumentException("Date is empty");
            }
            else if (value.GetType() != typeof(DateTime))
            {
                throw new ArgumentException("Invalid date");
            }
            else
            {
                dateBirth = value;
            }
        }

这是我的MainWindow.xaml

private void btnSet_Click(object sender, RoutedEventArgs e)
    {
        Person p = new Person();

        try
        {
            p.DateBirth = txtDate.Text;  //this is the textbox I want to check
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
      }

如果我在我的textbox日期中插入例如01/01/1990,它始终是一个无效的日期',作为第二个ArgumentException

由于

4 个答案:

答案 0 :(得分:0)

因为它是一个字符串...你必须将它解析为DateTime并检查它是否成功。

答案 1 :(得分:0)

这是合理的,因为txtDate.Text的类型是字符串。您必须先解析用户的输入。基本上,我不会使用try catch块。我会尝试以下方法:

if(!DateTime.TryParse(txtDate.Text, out p.DateBirth))
{
    // The parse failed.
    MessageBox.Show("Invalid date");
}

如果您使用此方法,请不要

  

因为DateTime.TryParse(String,DateTime)方法试图解析   使用格式设置的日期和时间的字符串表示形式   当前文化的规则,试图解析一个特定的字符串   跨越不同的文化可能会失败或返回不同的结果。   如果将跨不同的方式解析特定的日期和时间格式   locales,使用DateTime.TryParse(String,IFormatProvider,   DateTimeStyles,DateTime)方法或其中一个重载   TryParseExact方法并提供格式说明符。

有关此问题的详细信息,请查看here

答案 2 :(得分:0)

您的属性是字符串类型属性

public string DateBirth

你在setter中获得的值也总是一个字符串

else if (value.GetType() != typeof(DateTime))

使用DateTime.TryParse将字符串转换回Date first

答案 3 :(得分:0)

DateTime.TryParseExact(..)函数允许您使用特定日期格式解析日期(例如," mm / dd / yyyy")。但是,如果您希望对年份中的位数保持灵活性,那么正则表达式可能是更好的选择。

if  (!DateTime.TryParseExact(txtDate.Text, out value))
{
     return false;
}