1

2 つの質問があります。

1)これは、変数のデフォルト値を 0 にしてから、ユーザーが指定した値をその変数に渡す正しい方法ですか?

protected void btnCheck_Click(object sender, EventArgs e)
    {
        lblYesNo.Text = "";
        //default int values are set to 0
        int remainder = 0;
        int guess = 0;

        remainder = int.Parse(txtRemainder.Text);

        guess = int.Parse(txtAnswer.Text);
        answer = (int)Session["answer"];
        if (guess == answer)
        {
            lblYesNo.Text = lblYesNo.Text + "Correct!";
        }
        else
        {
            lblYesNo.Text = lblYesNo.Text + "Try Again..";
        }
    }//END Check Answer

2) Check_Click(送信ボタン) が txtReminder(テキストボックス) を非表示にしないようにするにはどうすればよいですか? 現在「自動非表示」になっているのは、デフォルト値を「txtReminder.Visible = false;」に設定したためです。これにより、数学の問題が除算でない限り非表示になります。btnDiv_Click(分割ボタン) をクリックすると、「txtReminder.Visible = true;」にリセットされます。これは、分割の問題が解決されるためです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class BasicMath : System.Web.UI.Page
{
    int number1;
    int number2;
    int answer;

    protected void Page_Load(object sender, EventArgs e)
    {
        txtRemainder.Visible = false;
    }

    protected void GetRandom()
    {
        Random rand = new Random();
        number1 = rand.Next(0, 10);
        number2 = rand.Next(0, 10);
        txtAnswer.Text = "";
        txtRemainder.Text = "";
        lblYesNo.Text = "";
    }//END Get Random Number

    protected void btnAdd_Click(object sender, EventArgs e)
    {
        GetRandom();
        lblEquation.Text = number1.ToString() + " + " + number2.ToString();
        answer = number1 + number2;
        Session["answer"] = answer;
    }//END Addition Button

    protected void btnSub_Click(object sender, EventArgs e)
    {
        GetRandom();
        if (number2 > number1)
        {
            answer = number2 - number1;
            lblEquation.Text = number2.ToString() + " - " + number1.ToString();
        }
        else
        {
            answer = number1 - number2;
            lblEquation.Text = number1.ToString() + " - " + number2.ToString();
        }
        Session["answer"] = answer;

    }//END Subtraction Button

    protected void btnMult_Click(object sender, EventArgs e)
    {
        GetRandom();
        lblEquation.Text = number1.ToString() + " x " + number2.ToString();
        answer = number1 * number2;
        Session["answer"] = answer;
    }//END Multiplication Button

    protected void btnDiv_Click(object sender, EventArgs e)
    {

        Random rand = new Random();
        number1 = rand.Next(1, 10);
        number2 = rand.Next(1, 10);
        /*will only display the txtRemainder(textbox) while using the Divide button,
           txtRemainder will auto-hide when using another button because
           it's default setting of '.Visible = false' is placed in the Page_Load*/
        txtRemainder.Visible = true;
        lblEquation.Text = number1.ToString() + " / " + number2.ToString(); 
        answer = number1 / number2;
        Session["answer"] = answer;

    }//END Division Button

    protected void btnCheck_Click(object sender, EventArgs e)
    {
        lblYesNo.Text = "";
        //default int values are set to 0
        int remainder = 0;
        int guess = 0;

        remainder = int.Parse(txtRemainder.Text);

        guess = int.Parse(txtAnswer.Text);
        answer = (int)Session["answer"];
        if (guess == answer)
        {
            lblYesNo.Text = lblYesNo.Text + "Correct!";
        }
        else
        {
            lblYesNo.Text = lblYesNo.Text + "Try Again..";
        }
    }//END Check Answer
}

この質問が意味をなさない場合は、説明を求めてください。

4

2 に答える 2

1

質問1:

はい、これは変数をデフォルト値のゼロに初期化する正しい方法ですが、int変数はデフォルトでゼロに初期化されるため、代入を省略した場合でもデフォルトでゼロになります。

ユーザー入力を受け入れるために使用している方法は正しいですが、ユーザーが入力した値が Int32 値でない場合 (3.2 を考えてください)、例外がスローされる可能性があります。現状では、これらの例外を処理するための try..catch ブロックはありません。これらの try..catch ブロックを追加するか、TryParse() メソッドを使用して値が有効であることを確認できます。例えば:

protected void btnCheck_Click(object sender, EventArgs e)
{
    lblYesNo.Text = "";
    //default int values are set to 0
    int remainder = 0;
    int guess = 0;

    if (!Int32.TryParse(txtRemainder.Text, out remainder))
    {
        // do something here to inform the user that remainder is invalid
        return;
    }

    if (!Int32.TryParse(txtAnswer.Text, out remainder))
    {
        // do something here to inform the user that answer is invalid
        return;
    }

    answer = (int)Session["answer"];
    if (guess > answer)
    {
        lblYesNo.Text = lblYesNo.Text + "Try Again..";
    }
    else if (guess < answer)
    {
        lblYesNo.Text = lblYesNo.Text + "Try Again..";
    }
    else
    {
        lblYesNo.Text = lblYesNo.Text + "Correct!";
    }
}//END Check Answer

TryParse() は、値が有効な値である場合は値を出力変数に変換し、true成功を示すために戻ります。それ以外の場合はfalse、変換を実行できなかった場合に戻ります。

質問2:

ページが最初に読み込まれたときに非表示txtRemainderにし、 以外のボタンがクリックされた場合に非表示のままにするためにbtnDiv、提案された解決策を次に示します。まず、コード:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack) {
        lblTest.Visible = false;
    } else {
        foreach (string ctrl in Request.Form) {
            Control c = FindControl(ctrl);
            if (c is Button) {
                txtRemainder.Visible = c.ID == "btnDiv";
                return;
            }
        }
    }
}

さて、いくつか説明します。ページが最初にロードされるとき、ラベルは (!IsPostBackチェックにより) 非表示になっています。リクエストが実際にポストバックである場合は、返されたフォーム コントロール (コレクションに含まれるRequest.Form) のコレクションを調べて、ポストバックの原因となった可能性のあるボタンが存在するかどうかを確認します。ボタンは要素として HTML にレンダリングされ、ポストバック時に、ページに複数の送信がある場合でも、クリックされたボタンのみがコレクションに<input type="submit" .. />返されます。より詳細な説明は、ここFormで見つけることができます

ここで、ボタンが実際にポストバックを引き起こした場合、このボタンが であったかどうかを確認しますbtnDiv。そうであった場合、比較はtrue&txtRemainderを返します。そうでない場合は、非表示になります。

txtRemainderこのように、各イベント ハンドラーで表示または非表示にする必要はありません。のイベント ハンドラで可視に設定する必要さえありませんbtnDiv

編集

コメントに記載されている要件に基づいて、各ボタン イベントでラベルを表示または非表示にする代わりの方法を提供するために、質問 2 に対する回答を変更しました。

于 2012-12-08T00:01:10.160 に答える
0

質問 1: .Net 4.0 以降を使用している場合は、TryParseメソッドの使用を検討し、結果が成功したかどうかを確認してください。これにより、値の解析と例外のトラップをより適切に制御できます。

int number = 0;
bool result = false;

result = int.TryParse("123", out number);

if (!result)
{
    throw new InvalidCastException("Error converting number");
}

質問 2: Asp.Net を使用しているようですのでPage.IsPostBack、Page_Load イベントでテストしてみてください。この方法で、ページが初期読み込みのために読み込まれたのか、それともサーバーにデータを送信した、つまりボタンをクリックしたために読み込まれたのかを判断できます。

お役に立てれば!

于 2012-12-08T00:01:19.973 に答える