0

いくつかのコンストラクターを持つクラス、コマンドボタンを持つフォーム、および「form.cs」で20に設定された1つのパブリック変数があります。ボタンをクリックするたびに、変数がゼロになるまで変数をデクリメントするにはどうすればよいですか?クリックイベント内のループ、コンストラクター(変数=変数-1)での単純な推論など、いくつかの方法を試しましたが、機能しません。これを試しました:

public void AssignSeat()
{
   seats = seats - 1;    
}

その後

private void button2_Click(object sender, EventArgs e)
{
    Class1 Class1 = new Class1();
    Class1.AssignSeat();
    Class1.MSGbox();                     
}

コンパイルしてエラーなしで実行しますが、停止することはありません!

4

4 に答える 4

4

ここ:

Class1 Class1 = new Class1();
Class1.AssignSeat();
Class1.MSGbox();

...ボタンがクリックされるたびにの新しいインスタンスを作成しています。Class1メソッドはbutton2_clickすでに範囲内にありClass1ますか?その場合は、呼び出す必要がAssignSeatあります。フォームの新しいインスタンスを作成する必要はありません。

(パブリック変数に対しても強くお勧めしますが、それは別の問題です。)

于 2012-12-01T18:19:14.650 に答える
0

ボタンをクリックするたびにClass1の新しいインスタンスを構築し、メソッドが終了するとすぐに破棄されるこの新しく作成されたインスタンスのシートをデクリメントします。
フォーム内にClass1型のプライベート変数を入れて(フォームのコストラクチャーを呼び出す)、次のように使用します。

public partial class Form1: Form {
    private Class1 _class1 = new Class1();

    private void button2_Click(object sender, EventArgs e) {
        _class1.AssignSeat();
        _class1.MSGbox();   
    }
}
于 2012-12-01T18:20:35.690 に答える
0

ボタンをクリックするたびに新しいオブジェクトを作成していますが、問題を解決するには、seats静的にします。

@JonSkeetが言うように、これは悪いデザインです

于 2012-12-01T18:22:19.143 に答える
0
  1. はいの場合、両方のメソッドは同じクラスにあります。その場合、Class1がそれにアクセスするためのオブジェクトを作成する必要はありません。
  2. ボタンをクリックするたびに変数が20に設定されますか。
  3. あなたが書いたものによると、あなたは毎回新しいインスタンスを作成しているので、あなたの問題が発生します。

iCountとiTempの外側のボタンクリックを宣言する

int iCount = 0; int iTemp = 20;

    private void button2_Click(object sender, EventArgs e)
    {
        if (iCount == 0)
        {
            iTemp = 20;
            iCount++;
        }
        iTemp = iTemp - 1;
        MessageBox.Show(iTemp.ToString());
    }
}
于 2012-12-01T18:50:07.897 に答える