0

私は大学向けのプロジェクトを行っており、簡単なランチ メニューのパネルを作成しています。チェックボックスで表示されている場合のメニューの各項目。私がやりたかったのは、新しいアイテムがチェックされたりチェックされなかったりするたびに合計が変わることでした。これは私がこれまで使ってみたコードですが、実行するとプログラムがフリーズするようです。while ループを使用して、チェック ボックスがオンになっているかオフになっているかを常に確認しようとしました。

内部にチェックボックスがあり、パネルの下部にラベルがあるパネルがあります。

while ループを使用して各チェック ボックスのチェック状態を確認し、それに応じてラベル テキストを更新するという点で、私は正しい行にいますか?

private void plBistro_Paint(object sender, PaintEventArgs e)
        {
            //create a variable to hold the total
            double bistotal = 0.0;

            while(bistotal != 99){
                //check if they chose a ham sandwich
                if(cbHamSandwich.Checked == true){

                    //if they did add 1.20 to the value of bistotal
                    bistotal = bistotal + 1.20;
                }

            string bistotalString = Convert.ToString(bistotal);

            lblBistroTotal.Text = bistotalString;
        }
        }
4

7 に答える 7

4

あなたはこれに対して間違ったアプローチを取っています。チェックボックスはイベントを発生させ、イベント ハンドラーは合計を維持する必要があります。

于 2012-05-10T16:56:50.257 に答える
3

はい、無限ループが発生し、ラベルを変更すると再描画が発生します...

CheckBox.CheckChanged イベントのハンドラーを追加し、そこで必要なことを行います。

于 2012-05-10T16:57:18.743 に答える
2

コードに無限ループがあり、さらに Paint イベントはこの計算を行う場所ではありません。次のようなものが必要です。

private void cbHamSandwich_CheckChanged (object sender, EventArgs e)
{
    CalcTotal();
}

private void CalcTotal()
{
    double bistotal = 0.0;

    if(cbHamSandwich.Checked == true)
    {
        //if they did add 1.20 to the value of bistotal
        bistotal = bistotal + 1.20;
    } 

    // more selected values to add to total

    lblBistroTotal.Text = bistotal.ToString("c");
}

CheckChanged合計金額を変更する必要があるオプションごとにイベントを追加します。

于 2012-05-10T17:03:57.900 に答える
0

ここで起こっていることは、UI スレッドで何かにアクセスまたは設定する (cbHamSandwich にアクセスするか、lblBistroTotal でテキストを設定する) と、設定されるたびに新しいペイント イベントがトリガーされ、無限ループになることだと思います。おそらく、この更新をタイマーで行うか、他の UI イベントをリッスンする必要があります。

編集: もう少し詳しく見てみると、whileループ自体も根本的な問題のようです。基本的に、チェックボックスがチェックされている場合は、合計を少なくとも 99 まで増やしたいと言っています (合計は 99 ではありませんが、チェックボックスがチェックされている場合は、追加を続けてください)。しかし、99 に達すると、そのループから抜け出します。それは、最も重要な問題ではありません

于 2012-05-10T17:00:27.307 に答える
0

変更されたハンドラーにチェックボックスを付けたい..次のようなもの:

private void chkBox_CheckedChanged(object sender, System.EventArgs e) {
  if (sender is CheckBox) { 
    CheckBox checkbox = sender as CheckBox;

    //do you checkbox accounting here
    if (checkbox.Checked){
      //blah
    }else{
      //blah
    }
  }
}

// elsewhere..assign event handler
chkBox.CheckedChanged += new EventHandler(chkBox_CheckedChanged);
于 2012-05-10T17:02:10.773 に答える
0

CheckedChanged および CheckStateChanged イベントが発生します。次のように使用します。

private void cbHamSandwich_CheckedChanged(object sender, EventArgs e)
{
    //Verify(Check) the Checked property of the Checkbox and
    //Your Code Goes Here
}

および、また:

private void cbHamSandwich_CheckStateChanged(object sender, EventArgs e)
{
    //Verify(Check) the CheckState property of the Checkbox and
    //Your Code Goes Here
}
于 2012-05-10T17:03:12.330 に答える
0

前述のように、ペイント イベントでこれを処理することは、実際にやりたいことではありません。私のアドバイスは、すべてのチェック ボックスが接続されているイベント ハンドラー内にコードを配置することです。明らかに、「checkBox2_CheckStateChanged」よりも適切な名前の方が適切ですが、関数には好きな名前を付けることができます。

同じイベント ハンドラを使用するように 2 つのコントロールを設定する

編集: または、チェックボックスごとに CheckChanged イベント ハンドラーを作成し、関数を呼び出して合計を計算することもできます。

于 2012-05-10T17:04:34.087 に答える