0

我正在尝试制作一个 VideoClub 应用程序。我有一个名为 的文本框txtMovieDuration,我想在其中输入电影时长 ofc。
我所做的是,我允许用户以这种格式(hh:mm:ss)只写数字。点会自动出现。但是,有这个问题,逻辑上 ss(秒)和 mm(分钟)不能大于59(因为它们只从 0 到 59)。如何检查秒和分钟< 60

private void txtMovieDuration_TextChanged(object sender, EventArgs e)  
        {  
            txtMovieDuration.MaxLength = 8;

            if (txtMovieDuration.Text.Length == 2)
            {
                txtMovieDuration.Text += ":";
            }

            if (txtMovieDuration.Text.Length == 5)
            {
                txtMovieDuration.Text += ":";
            }

            txtMovieDuration.SelectionStart = txtMovieDuration.Text.Length;
         }
4

6 回答 6

4

您可以使用TimeSpan.TryParse来验证用户输入:

TimeSpan duration;
if (!TimeSpan.TryParse(txtMovieDuration.Text, out duration))
{
    MessageBox.Show("Please use correct format 'hh:mm:ss'!)");
}

您应该考虑使用SWeko提到的可选DateTimePicker控件。

于 2013-01-08T12:31:20.300 回答
4

简短回答:使用DateTimePicker控件,其格式属性设置为时间。

但是,如果您无法使用文本框,您可以

  • 使用正则表达式检查格式(如@David Aleu 的回答)
  • 在分隔符 ( ) 上拆分字符串:并手动验证这些部分,例如:

    string[] parts = txtMovieDuration.Text.Split(':');
    if (parts.Length !=3) //there must be a hh:mi:ss parts
    {
       MessageBox.Show("invalid time string");
       return;
    }
    int hours;
    if (int.TryParse(parts[0], out hours))
    {
       MessageBox.Show("the hours part is not a number");
       return;
    }
    //if you want to check the value of hours as sensible you could do it here
    //as there are very few movies longer than 10 hours
    int minutes;
    if (int.TryParse(parts[1], out minutes))
    {
       MessageBox.Show("the minutes part is not a number");
       return;
    }
    if ((minutes < 0) || (minutes > 59)
    {
       MessageBox.Show("the minutes part is out of range");
       return;
    }
    
    int seconds;
    if (int.TryParse(parts[2], out seconds))
    {
       MessageBox.Show("the seconds part is not a number");
       return;
    }
    if ((seconds < 0) || (seconds > 59)
    {
       MessageBox.Show("the seconds part is out of range");
       return;
    }
    //you can now make a TimeSpan object for the duration
    TimeSpan duration = new TimeSpan(hours, minutes, seconds);
    

    您也可以不检查小时/分钟/秒变量的范围,但(ab)使用TimeSpan构造函数的功能。由于这些值只是转换为刻度,并且刻度用于初始化TimeSpan,因此这样做是合法的new TimeSpan(1000,2000,3000)。它将创建 1000 小时、2000 分钟(又名 33 小时 20 分钟)和 3000 秒(又名 50 分钟)的时间跨度,从而产生 43 天 2 小时 10 分钟的时间跨度。这一切都意味着你可以这样做:

    TimeSpan duration = new TimeSpan(hours, minutes, seconds);
    if ((duration .Hours != hours)
         || (duration .Minutes != minutes) 
         || (duration .Seconds != seconds))
    {
       MessageBox.Show("the seconds part is out of range");
       return;
    }
    
于 2013-01-08T12:31:08.640 回答
2

如果你这样做呢?

public bool ValidateTime(string time)
{
     Regex regExp = new Regex(@"(([0-1][0-9])|([2][0-3])):([0-5][0-9]):([0-5][0-9])");

     return regExp.IsMatch(time);
}

在这里找到

于 2013-01-08T12:28:54.040 回答
0

您可以从文本框中读取字符串值并将其转换为 Int 或您使用的任何数据类型。更多关于转换的帮助可以在这里找到

于 2013-01-08T12:30:51.260 回答
0

您可以将 aMaskedTextBox与掩码一起使用,00:00:00而不是使用法线TextBox,它会自动添加:s 并且只允许输入数字。

要检查它的值是否是有效的时间跨度值,请将其设置ValidatingTypeTimeSpan

this.maskedTextBox1.ValidatingType = typeof(TimeSpan);

然后您可以侦听该MaskedTextBox.TypeValidationCompleted事件并使用它e.IsValidInput来确定用户是否输入了正确的时间跨度值。

于 2013-01-08T13:10:37.550 回答
0

创建秒的子字符串。

String sub = txtMovieDuration.Text.Substring(6);
if(Convert.ToInt32(sub) < 60)
//Do something here

做同样的几分钟或一起做。例如:

if(Convert.ToInt32(txtMovieDuration.Text.Substring(3,2)) && Convert.ToInt32(txtMovieDuration.Text.Substring(6)) > 60)
{ 
   //Error handling code

}

注意:我假设 : 是字符串的一部分。如果没有,只需更改子字符串的开始和结束值。

于 2013-01-08T12:37:02.797 回答