0

我的 Windows 表单中有一个字段,要求用户输入他们的出生日期...我如何验证我的表单以仅接受数字和“/”(分隔符)以及 dd/mm/yyyy 格式.. 还有一天应小于 31,月份应小于 12,年份不大于 2012

4

4 回答 4

6

文本框不是接受日期时间输入的控件。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
}
于 2013-08-10T09:06:14.170 回答
2

我认为您应该选择DateTimePicker,但是我们也可以使用 a TextBoxwith 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.

于 2013-08-10T09:56:25.507 回答
1

如果您使用 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));    
}
于 2013-08-10T09:49:27.927 回答
0

您想在用户完成后进行验证吗?在这种情况下,您可以尝试将字符串解析为日期并查看它是否是正确的日期。在这种情况下,您还可以获得正确的月份日期。

于 2013-08-10T09:06:12.367 回答