2012-05-10 1 views
0

Я делаю проект для колледжа и создаю панель с простым меню обеда. Каждый элемент меню, если он установлен флажком. То, что я хотел, состояло в том, чтобы общее количество было изменено каждый раз, когда новый элемент проверяется или отменяется. Это код, который я пытался использовать до сих пор, но, похоже, он затормозит программу, когда я ее запускаю. Я попытался использовать цикл while, чтобы постоянно проверять, отмечены ли флажки или не проверены флажки.Visual C# окна форм постоянно проверять и обновлять значение?

Существует панель с флажками внутри и этикеткой внизу панели.

Я нахожусь на правильной линии с точки зрения использования цикла 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; 
     } 
     } 
+1

Не используйте Paint даже для вычисления чего-либо. Просто краска. –

+0

Что вы имеете в виду, когда говорите краску? – crm

+3

Просто не используйте событие рисования вообще. Это не относится к вашей проблеме. Используйте флажок CheckedChanged. Вам не нужен цикл. Приложения Windows управляются событиями. Вы не проводите опрос на события (цикл), вы просто сидите и ждете их. Когда вы зацикливаетесь, ваше приложение задерживает дыхание и ждет, пока вы прекратите цикл. –

ответ

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 события для каждого варианта, который необходимо изменить общую цену.

+0

Почему вы использовали массив для хранения всего? – crm

+0

Он этого не сделал. Массив в C# обозначается квадратными скобками: int [] intArray; – CodeHxr

+0

Извините тупой колпачок, его функция, которая вызывается, когда каждый флажок щелкнут, спасибо. – crm

4

Вы принимаете неправильный подход к этому. Флажки должны поднять событие, и обработчик события должен позаботиться об этом.

3

Да, это вызовет бесконечный цикл, изменение метки вызовет перерисовку ...

добавить обработчик для события CheckBox.CheckChanged и делать то, что вы хотите там.

0

Я предполагаю, что здесь происходит то, что доступ или установка чего-либо в потоке пользовательского интерфейса (либо доступ к cbHamSandwich, либо установка текста на lblBistroTotal) запускает новое событие paint каждый раз, когда он установлен, таким образом, бесконечный цикл , Вероятно, вы должны делать это обновление в таймере или слушать другие события пользовательского интерфейса.

Редактировать: Теперь, когда я выгляжу немного ближе, кажется, что цикл while также является фундаментальной проблемой. Вы в основном говорите, что хотите увеличить общую сумму до 99, когда флажок установлен (пока общее количество не 99, если флажок установлен, продолжайте добавлять). Но это будет вырваться из этого цикла, как только он достигнет 99. Это не ваша самая важная проблема.

0

Вы хотите, чтобы ваши флажков OnChanged handlers..something как:

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); 
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 
} 
0

Как уже упоминалось, обработка этого события на краске не является тем, что вы собираетесь делать. Мой совет - поместить свой код внутри обработчика событий, к которому подключены все ваши флажки. Очевидно, что имя, более подходящее, чем «checkBox2_CheckStateChanged», было бы лучше, но вы можете назвать функцию как угодно.

Setting two controls to use the same event handler

EDIT: Или вы можете сделать обработчик события CheckChanged для каждого флажка и вызвать функцию для расчета итоговых данных.