我试图做一些验证的形式,但我有问题与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
。
谢谢
您的属性是字符串类型的属性
public string DateBirth
你在setter中得到的值也总是一个字符串
else if (value.GetType() != typeof(DateTime))
使用DateTime。TryParse将字符串转换回日期优先
因为它是一个字符串…您必须将其解析为DateTime并检查是否成功。
这是合理的,因为txtDate.Text
的类型是字符串。您必须首先解析用户的输入。基本上,我不会使用try catch块。我本可以试着这样做:
if(!DateTime.TryParse(txtDate.Text, out p.DateBirth))
{
// The parse failed.
MessageBox.Show("Invalid date");
}
如果你使用这种方法,请不要使用
因为DateTime。TryParse(String, DateTime)方法尝试解析日期和时间的字符串表示形式规则的当前区域性,试图解析一个特定的字符串在不同的文化中可能失败或返回不同的结果。如果一个特定的日期和时间格式将被解析跨不同locale中,使用DateTime。IFormatProvider TryParse(字符串,方法的重载之一TryParseExact方法并提供格式说明符。
DateTime.TryParseExact(..)函数允许您使用特定的日期格式(例如,"mm/dd/yyyy")来解析日期。但是,如果您希望在一年中的位数上更灵活,那么regex可能是更好的选择。
if (!DateTime.TryParseExact(txtDate.Text, out value))
{
return false;
}