Visual C#windows窗体不断检查和更新值?

时间:2012-05-10 16:53:57

标签: c# visual-studio checkbox

我正在为大学做一个项目,并创建了一个带有简单午餐菜单的小组。如果通过复选框显示菜​​单的每个项目。我想要发生的是每次检查或取消选中新项目时更改总数。这是我到目前为止尝试使用的代码,但它似乎在我运行时冻结程序。我尝试使用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;
        }
        }

7 个答案:

答案 0 :(得分:4)

你采取了错误的做法。复选框应该引发一个事件,事件处理程序应该负责维护总数。

答案 1 :(得分:3)

是的,这将导致无限循环,更改标签将导致重新绘制......

为CheckBox.CheckChanged事件添加一个处理程序,并在那里做你想做的事。

答案 2 :(得分: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个事件。

答案 3 :(得分:0)

我猜这里发生的事情是访问或设置UI线程上的内容(访问cbHamSandwich或在lblBistroTotal上设置文本)每次设置时都会触发一个新的绘制事件,因此是一个无限循环。您可能应该在计时器中执行此更新,或者侦听其他UI事件。

修改 现在我看起来更接近了,看起来while循环本身也是一个根本问题。你基本上说当你选中复选框时你想要将你的总数一直增加到至少99(当总数不是99时,如果勾选复选框,继续添加)。但是,一旦达到99,突破该循环。这不是你最关键的问题。

答案 4 :(得分: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);

答案 5 :(得分: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
}

答案 6 :(得分:0)

如前所述,在paint事件中处理这个并不是你想要做的事情。我的建议是将您的代码放在一个事件处理程序中,所有复选框都连接到该事件处理程序。显然,一个比“checkBox2_CheckStateChanged”更合适的名称会更好,但是你可以将这个函数命名为任何你喜欢的名字。

Setting two controls to use the same event handler

编辑:或者你可以为每个复选框创建一个CheckChanged事件处理程序,并调用一个函数来计算你的总数。