0

サブルーチンがあります。値が空かどうかを比較してから何かをします。たとえば、それらが空の場合、警告が発生します。コードは正常に動作します。ただし、値が空でない場合、警告は引き続き表示されます。ロジックを修正するのを手伝ってください。

ありがとう。

private void btnNew_Click(object sender, EventArgs e)
    {
        try
        {
            if (txtbox1.Text.ToString().Trim() == string.Empty)
            {
                goto Msg1;
            }
            if (txtbox2.Text.ToString().Trim() == string.Empty)
            {
                goto Msg2;
            }
            DataRow dr = mydataSet.Tables[0].NewRow();
            dr["Descript"] = txtbox1.Text;
            dr["Abbr"] = txtbox2.Text;
            dr["SortOrder"] = Convert.ToDecimal(numericOrder.Value);
            if (SortOrders.Contains((decimal)dr["SortOrder"]))
            {
                goto Msg3;
            }
            mydataSet.Tables[0].Rows.Add(dr);
            dgv.DataSource = mydataSet.Tables[0];
        Msg1:
            MessageBox.Show("Description is required.");
        Msg2:
            MessageBox.Show("Abbr is required.");
        Msg3:
            MessageBox.Show("Please select another one, this one is already used.");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

上記のコードからわかります。txtbox1 に何らかの値がある場合、プログラムは引き続き Msg1 を表示します。避けたい。

4

6 に答える 6

9

ラベルは単なるラベルであり、その後のコードは順番に実行されるためです。

なぜこれができないのですか:

    try
    {
        if (txtbox1.Text.ToString().Trim() == string.Empty)
        {
            MessageBox.Show("Description is required.");
            return;
        }
        if (txtbox2.Text.ToString().Trim() == string.Empty)
        {
            MessageBox.Show("Abbr is required.");
            return;
        }
        DataRow dr = mydataSet.Tables[0].NewRow();
        dr["Descript"] = txtbox1.Text;
        dr["Abbr"] = txtbox2.Text;
        dr["SortOrder"] = Convert.ToDecimal(numericOrder.Value);
        if (SortOrders.Contains((decimal)dr["SortOrder"]))
        {
            MessageBox.Show("Please select another one, this one is already used.");
            return;
        }
        mydataSet.Tables[0].Rows.Add(dr);
        dgv.DataSource = mydataSet.Tables[0];
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

それはとても読みやすいです。

于 2012-07-30T21:04:41.717 に答える
4

回避するためにコードを再構築します。gotoこれは遺物であり、適切なオブジェクト指向のコードベースではあまり使用されません。

メソッドから戻る、例外をスローする、またはエラーディクショナリを作成することはすべて、を使用するよりも優れたオプションですgoto

たとえばList<string> errors、エラー状態が発生したときに追加することができます。

空の場合はエラーは発生しませんでした。空でない場合はエラーが発生しました。

于 2012-07-30T21:03:43.997 に答える
2

これは良いケースgotoですが、間違った方法です。代わりにこのようなものを使用してください。

private void btnNew_Click(object sender, EventArgs e)
{
    try
    {
        bool error = false;
        if (txtbox1.Text.ToString().Trim() == string.Empty)
        {
            MessageBox.Show("Description is required.");
            error = true;
        }
        if (txtbox2.Text.ToString().Trim() == string.Empty)
        {
            MessageBox.Show("Abbr is required.");
            error = true;
        }
        if (SortOrders.Contains(Convert.ToDecimal(numericOrder.Value)
        {
            MessageBox.Show("Please select another one, this one is already used.");
            error = true;
        }

        if(error)
            return;

        DataRow dr = mydataSet.Tables[0].NewRow();
        dr["Descript"] = txtbox1.Text;
        dr["Abbr"] = txtbox2.Text;
        dr["SortOrder"] = Convert.ToDecimal(numericOrder.Value);
        mydataSet.Tables[0].Rows.Add(dr);
        dgv.DataSource = mydataSet.Tables[0];
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

編集

私のコードは実際には彼の最初のサンプルと同じように動作しなかったことがわかりました。発生したエラーの数に関係なく、最初のエラーしか表示されなかったからです。それに対応するようにサンプルを更新しました。

于 2012-07-30T21:05:27.177 に答える
0
private void btnNew_Click(object sender, EventArgs e)
{
    try
    {
        var description = txtbox1.Text.Trim();
        if (string.IsNullOrEmpty(description))
        {
            MessageBox.Show("Description is required.");
            return;
        }
        var abbr = txtbox2.Text.Trim();
        if (string.IsNullOrEmpty(abbr))
        {
            MessageBox.Show("Abbr is required.");
            return;
        }
        var numericOrderValue = Convert.ToDecimal(numericOrder.Value);
        if (SortOrders.Contains(numericOrderValue)
        {
            MessageBox.Show("Please select another one, this one is already used.");
            return;
        }

        DataRow dr = mydataSet.Tables[0].NewRow();
        dr["Descript"] = description;
        dr["Abbr"] = abbr;          
        dr["SortOrder"] = numericOrderValue;            
        mydataSet.Tables[0].Rows.Add(dr);
        dgv.DataSource = mydataSet.Tables[0];
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
于 2012-07-30T21:10:10.010 に答える
0

私はいつもペストのように goto を避けるように教えられてきました。コードを書くとき、それがオプションであると考えたことさえありません。

とはいえ、考えてみると、数年前に記事を読みました (今は見つかりません)。この記事では、goto を使用してコードを下にジャンプする場合にのみ確実に使用でき、上にジャンプしない場合にのみ信頼できると述べています。ここ。

詳細については、ここを確認してください: C# でまだ [goto] を使用している人はいますか? もしそうなら、その理由は?

「return」(メソッドの途中で使用する場合)、「break」、「continue」を使用するインスタンスの場合、goto ステートメントを使用するより良い方法があります。これらのいずれかを使用したことがありますか?

于 2012-07-30T21:05:37.497 に答える
-1
private void btnNew_Click(object sender, EventArgs e)
    {
        try
        {
            if (txtbox1.Text.ToString().Trim() == string.Empty)
            {
                MessageBox.Show("Description is required.");
            }
            if (txtbox2.Text.ToString().Trim() == string.Empty)
            {
                MessageBox.Show("Abbr is required.");
            }
            DataRow dr = mydataSet.Tables[0].NewRow();
            dr["Descript"] = txtbox1.Text;
            dr["Abbr"] = txtbox2.Text;
            dr["SortOrder"] = Convert.ToDecimal(numericOrder.Value);
            if (SortOrders.Contains((decimal)dr["SortOrder"]))
            {
               MessageBox.Show("Please select another one, this one is already used.");
            }
            mydataSet.Tables[0].Rows.Add(dr);
            dgv.DataSource = mydataSet.Tables[0];

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

これを試して。できます。

于 2012-07-30T21:06:12.213 に答える