0

こんにちは、私はこのサイトを初めて使用するので、正しく説明していない場合は申し訳ありません:

C# フォーム アプリを作成しています。アプリにエラーはありませんが、入力フィールドをクリアすると FormatException was unhandeld が返されます。

これは、この関数に適用できる唯一のコードです。

    private void txtR_TextChanged(object sender, EventArgs e)
    {

        R = Convert.ToInt32(txtR.Text);
        E2 = Convert.ToInt32(txtE2.Text);
        E = R * E2;
        txtE.Text = E.ToString();

        R = Convert.ToInt32(txtR.Text);
        D2 = Convert.ToInt32(txtD2.Text);
        D = R * D2;
        txtD.Text = D.ToString();

        R = Convert.ToInt32(txtR.Text);
        P2 = Convert.ToInt32(txtP2.Text);
        P = R * P2;
        txtP.Text = P.ToString();
     }
4

4 に答える 4

2

この関数Convert.ToInt32()は長さ 0 の文字列を処理できないため、txtR(または他のテキスト フィールドを) 空のままにすることはできません。

また、onTextChangedイベントでこのコードを実行しないことを検討することをお勧めします。一般的なシナリオは、のコンテンツを消去して、txtRトリガーonTextChangedして例外をスローすることです。

いずれにせよ、コードを防弾にするInt32.TryParse()ために、sharp12345 が提案したように、変換が確実に機能するようにすることをお勧めします。


Convert.ToInt32()ドキュメント: MSDN リンク。ビットを読み取りFormatExceptionます。

于 2012-05-06T21:30:10.907 に答える
1

int.TryParse()入力した値が正しく、空または文字列ではないかどうかを確認するために使用する必要があります。

したがって、このコードブロックは次のとおりです。

R = Convert.ToInt32(txtR.Text);
E2 = Convert.ToInt32(txtE2.Text);
E = R * E2;
txtE.Text = E.ToString();

次のように変換する必要があります。

if (int.TryParse(txtR.Text, out R) && int.TryParse(txtE2.Text, out E2)) {        
    E = R * E2;
    txtE.Text = E.ToString();
}

同じことがintと同じようにfloatでも機能します。

于 2012-05-06T22:11:05.083 に答える
1

フィールドをクリアするときにエラーが発生する理由は、空の文字列を数値に変換しようとしているためです。フィールドをクリアするtxtRと、String.Empty と等しくなるため、数値に変換できません。空の場合:

R = Convert.ToInt32(txtR.Text);

以下とほとんど同じです:

R = Convert.ToInt32("");

それができないこと。この問題を解決するには、最初にすべてのフィールドに値があるかどうかを確認する必要があります。

    private void txtR_TextChanged(object sender, EventArgs e)
{
    if(txtR.Text.Trim().Length != 0 
    && txtE2.Text.Trim().Length != 0 
    && txtD2.Text.Trim().Length != 0 
    && txtP2.Text.Trim().Length != 0)
    {

        R = float.Parse(txtR.Text);
        E2 = float.Parse(txtE2.Text);
        E = R * E2;
        txtE.Text = E.ToString();

        R = float.Parse(txtR.Text);
        D2 = float.Parse(txtD2.Text);
        D = R * D2;
        txtD.Text = D.ToString();

        R = float.Parse(txtR.Text);
        P2 = float.Parse(txtP2.Text);
        P = R * P2;
        txtP.Text = P.ToString();

    }
    else{
        MessageBox.Show("One or more of the fields were empty!");
    {
 }

お役に立てれば!

于 2012-05-06T21:31:38.037 に答える
0

Single.TryParseユーザー入力文字列を数値(整数ではなく浮動小数点数の場合)に変換するときに使用します。
通常、ユーザーが偽の値を挿入するのを簡単に防ぐことはできず、コードは失敗します。
代わりに、TryParseを使用すると、無効な入力の場合に例外なく入力文字列をテストできます。

    // Try to convert the R value just one time, everything fails if this fails
    if(!Single.TryParse(txtR.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out R))
        return; 
    if(Single.TryParse(txtE2.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out E2)) 
    {
        E = R * E2; 
        txtE.Text = E.ToString(); 
    }

    if(Single.TryParse(txtD2.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out D2))
    {
        D = R * D2; 
        txtD.Text = D.ToString(); 
    }

    if(Single.TryParse(txtP2.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out P2))
    {
        P = R * P2; 
        txtP.Text = P.ToString(); 
    }

参考のためにMSDNでここを参照してください

于 2012-05-06T22:11:40.153 に答える