我的 Windows 表单中有一个字段,要求用户输入他们的出生日期...我如何验证我的表单以仅接受数字和“/”(分隔符)以及 dd/mm/yyyy 格式.. 还有一天应小于 31,月份应小于 12,年份不大于 2012
4 回答
文本框不是接受日期时间输入的控件。DateTimePicker
应该使用一个内置控件。您的方法的问题是,即使您对一种格式的文本框进行屏蔽,比如dd/mm/yyyy
用户可能想要输入mm/dd/yyyy
. 所以,相当多的错误处理。而在datetimepicker
.
即使那样,如果您想使用文本框。做这个,
DateTime dt;
if (DateTime.TryParseExact(yourTexbox.Text.Trim(), "yourformattoaccept", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
{
//your code if parsing is successful
}
我认为您应该选择DateTimePicker
,但是我们也可以使用 a TextBox
with some Validating
。有多种验证数据。我们可以防止用户输入无效数据,也可以在用户提交后检查数据。在这里我将向您介绍第二种方法,因为第一种方法需要更多的代码来完成,它可能会阻止用户输入无效数据,但它也必须防止用户粘贴无效数据。这就是为什么第一种方法需要更多代码的原因。
对于第二种方法,您可以Validating
为您的事件处理程序添加代码TextBox
并使用Regex
如下所示:
private void textBox1_Validating(object sender, CancelEventArgs e)
{
Regex reg = new Regex(@"^(\d{1,2})/(\d{1,2})/(\d{4})$");
Match m = reg.Match(textBox1.Text);
if (m.Success)
{
int dd = int.Parse(m.Groups[1].Value);
int mm = int.Parse(m.Groups[2].Value);
int yyyy = int.Parse(m.Groups[3].Value);
e.Cancel = dd < 1 || dd > 31 || mm < 1 || mm > 12 || yyyy > 2012;
}
else e.Cancel = true;
if (e.Cancel)
{
if (MessageBox.Show("Wrong date format. The correct format is dd/mm/yyyy\n+ dd should be between 1 and 31.\n+ mm should be between 1 and 12.\n+ yyyy should be before 2013", "Invalid date", MessageBoxButtons.OKCancel, MessageBoxIcon.Error) == DialogResult.Cancel)
e.Cancel = false;
}
}
您可以将一些Submit
按钮与您textBox1
的测试一起添加到您的表单中。我希望您知道如何Validating
为您的textBox1
.
如果您使用 datatimepicker,您的生活会更轻松,但如果您仍然想呈现一个文本框并帮助用户防止输入非法日期,则此示例代码将助您一臂之力。我按下键并在字段退出时验证文本输入,如果没有有效日期,则防止离开。
private void textBox1_Validating(object sender, CancelEventArgs e)
{
TextBox tb = sender as TextBox;
if (tb != null)
{
DateTime res;
e.Cancel = !DateTime.TryParse(tb.Text, out res);
if (e.Cancel)
{
// if you have an errorProvider...
this.errorProvider1.SetError(
tb,
String.Format("'{0}' is not a valid date", tb.Text));
}
}
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
// add extra checks to determine if
// this char is allowed, set Handled to
// false. If you want to surpress the key
// set it to true
// get the current separator or have your own, then simply say @"/"
var dateSep = CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator;
e.Handled = !(Char.IsDigit(e.KeyChar) ||
(dateSep.IndexOf(e.KeyChar)>-1) ||
Char.IsControl(e.KeyChar));
}
您想在用户完成后进行验证吗?在这种情况下,您可以尝试将字符串解析为日期并查看它是否是正确的日期。在这种情况下,您还可以获得正确的月份日期。