我正在为大学做一个项目,并创建了一个带有简单午餐菜单的小组。如果通过复选框显示菜单的每个项目。我想要发生的是每次检查或取消选中新项目时更改总数。这是我到目前为止尝试使用的代码,但它似乎在我运行时冻结程序。我尝试使用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;
}
}
答案 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”更合适的名称会更好,但是你可以将这个函数命名为任何你喜欢的名字。
编辑:或者你可以为每个复选框创建一个CheckChanged事件处理程序,并调用一个函数来计算你的总数。