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

簡単な回答: DateTimePickerコントロールを使用し、その format プロパティを Time に設定します。

ただし、テキストボックスの使用に行き詰まっている場合は、次のことができます

  • 正規表現を使用して形式を確認します(@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);
    

    また、時間/分/秒変数の範囲を確認することはできませんが、TimeSpanコンストラクターの機能を (ab) 使用します。値は単にティックに変換され、ティックは の初期化に使用されるため、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 に答える
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 に答える
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

秒の部分文字列を作成します。

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 に答える
0

自動的にs を追加し、数値の入力のみを許可する法線を使用する代わりにMaskedTextBox、マスクでa を使用できます。00:00:00TextBox:

その値が有効なタイム スパン値であるかどうかを確認するには、その値を に設定ValidatingTypeTimeSpanます。

this.maskedTextBox1.ValidatingType = typeof(TimeSpan);

次に、MaskedTextBox.TypeValidationCompletedイベントをリッスンしe.IsValidInput、ユーザーが正しい期間値を入力したかどうかを判断するために使用できます。

于 2013-01-08T13:10:37.550 に答える