-1

こんにちは、ホテルの予約フォームを作成していて、泊数で総滞在費を計算したいと考えていました。到着日と出発日が必要ですが、検証を追加したいので、ユーザーが間違った形式を入力すると、再試行を求めるメッセージ ボックスが表示されます。これが私のコードで、すでにタイムスパンの変換に少し助けられているので、もう一度助けていただければ幸いです。エラーは「dateDiff = aDate」で始まる行にあり、変数 aDate と dDate が割り当てられていないことを示しています。

        String arrival, departure;
        arrival = textBox1.Text;
        departure = textBox2.Text;

        DateTime aDate, dDate;

        try
        {
            aDate = DateTime.ParseExact(arrival, "dd/mm/yyyy", null);
            dDate = DateTime.ParseExact(departure, "dd/mm/yyyy", null);
            return;
        }
        catch
        {
            MessageBox.Show("Invalid input format please enter in format DD/MM/YYYY");
        }

        TimeSpan dateDiff;
        dateDiff = dDate.Subtract(aDate);
        int nights = (int)dateDiff.TotalDays;

        textBox3.Text = ("" + nights);
        textBox5.Text = ("£" + (nights * 115));
4

5 に答える 5

1

あなたのコードはあなたのキャッチの後に続きます。try ブロック内の日付を使用してコードを配置します。

        String arrival, departure;
        arrival = textBox1.Text;
        departure = textBox2.Text;

        DateTime aDate, dDate;

        try
        {
            aDate = DateTime.ParseExact(arrival, "dd/mm/yyyy", null);
            dDate = DateTime.ParseExact(departure, "dd/mm/yyyy", null);

            TimeSpan dateDiff;
            dateDiff = dDate.Subtract(aDate);
            int nights = (int)dateDiff.TotalDays;

            textBox3.Text = ("" + nights);
            textBox5.Text = ("£" + (nights * 115));
        }
        catch
        {
            MessageBox.Show("Invalid input format please enter in format DD/MM/YYYY");
        }

正常に解析された場合は返さないでください。そうしないと、入力検証されたときに結果が得られません。

または、リターンを catch ブロックに配置して、失敗時に実行が停止されるようにします。

于 2012-11-16T11:09:27.613 に答える
1

あなたのコードは

    String arrival, departure;
    arrival = textBox1.Text;
    departure = textBox2.Text;

    DateTime aDate, dDate;

    try
    {
        aDate = DateTime.ParseExact(arrival, "dd/mm/yyyy", null);
        dDate = DateTime.ParseExact(departure, "dd/mm/yyyy", null);

        TimeSpan dateDiff;
        dateDiff = dDate.Subtract(aDate);
        int nights = (int)dateDiff.TotalDays;

        textBox3.Text = ("" + nights);
        textBox5.Text = ("£" + (nights * 115));

    }
    catch
    {
        MessageBox.Show("Invalid input format please enter in format DD/MM/YYYY");
        return;
    }
于 2012-11-16T11:12:29.333 に答える
0

にいくつかのデフォルト値を割り当てるaDatedDate、エラーはなくなります。その理由は、try ブロックで確実に値が割り当てられるかどうかをコンパイラが判断できないためです。できるよ

DateTime aDate = default(DateTime);
DateTime dDate = default(DateTime);

しかし

日付を検証するために try-catch を使用する代わりに、 DateTime.TryParseExactを使用する方が良い

DateTime aDate, dDate;


if (DateTime.TryParseExact(arrival, 
                           "dd/MM/yyyy", 
                            CultureInfo.InvariantCulture,
                            DateTimeStyles.NoCurrentDateDefault, 
                            out aDate))
{
    MessageBox.Show("Invalid input format please enter in format DD/MM/YYYY");
}

したがって、完全なコードは次のようになります。

String arrival, departure;
arrival = textBox1.Text;
departure = textBox2.Text;

DateTime aDate, dDate;


if (DateTime.TryParseExact(arrival, 
                            "dd/MM/yyyy", 
                            CultureInfo.InvariantCulture, 
                            DateTimeStyles.NoCurrentDateDefault, 
                            out aDate))
{
    MessageBox.Show("Invalid input format for Arrival Date - please enter in format DD/MM/YYYY");
}
if (DateTime.TryParseExact(departure, 
                            "dd/MM/yyyy", 
                            CultureInfo.InvariantCulture, 
                            DateTimeStyles.NoCurrentDateDefault, 
                            out dDate))
{
    MessageBox.Show("Invalid input format for Departure Date - please enter in format DD/MM/YYYY");
}


TimeSpan dateDiff;
dateDiff = dDate.Subtract(aDate);
int nights = (int)dateDiff.TotalDays;

textBox3.Text = ("" + nights);
textBox5.Text = ("£" + (nights * 115));
于 2012-11-16T11:10:06.423 に答える