Радио-кнопка проверена дважды
Пожалуйста, прочитайте мой вопрос, это не дубликат.
У меня есть три переключателя на форме Windows, и все эти кнопки имеют общее событие CheckedChanged. Когда я нажимаю любой из этих переключателей, он дважды запускает событие "CheckedChanged".
Вот мой код:
private void radioButtons_CheckedChanged(object sender, EventArgs e)
{
//My Code
}
Я вставил точку останова, и весь код внутри этого события повторяется дважды.
Скажите, пожалуйста, почему это так?
Ответы
Ответ 1
Как справедливо говорят другие ответчики, событие запускается дважды, потому что всякий раз, когда один RadioButton внутри группы проверяется, другой будет снят - поэтому проверенное измененное событие будет срабатывать дважды.
Чтобы выполнить только какую-либо работу в этом событии для выбранного RadioButton, вы можете посмотреть объект-отправитель, выполнив что-то вроде этого:
void radioButtons_CheckedChanged(object sender, EventArgs e)
{
RadioButton rb = sender as RadioButton;
if (rb != null)
{
if (rb.Checked)
{
// Only one radio button will be checked
Console.WriteLine("Changed: " + rb.Name);
}
}
}
Ответ 2
CheckedChanged увеличивается всякий раз, когда изменяется свойство Checked. Если вы выберете RadioButton, тогда выбранный ранее RadioButton не будет отмечен (запущен CheckedChanged), а затем будет установлен новый RadioButton (запущен CheckedChanged).
Ответ 3
Он запускает один раз для перехода переключателя переключателя из отмеченного на непроверенный, и снова для перехода переключателя с непроверенного на отметку (т.е. любое изменение в проверенном состоянии вызывает событие)
Ответ 4
Вы можете установить свойство AutoCheck true для каждого RadioButton, а затем поймать событие Click вместо события CheckChanged. Это обеспечит запуск только одного события, а логика в обработчике может передать отправителя для ввода RadioButton, если это необходимо для обработки щелчка. Часто литье можно избежать, если логика обработчика проста. Вот пример, который обрабатывает три элемента управления: rbTextNumeric, rbTextFixed и rbTextFromFile:
private void rbText_Click(object sender, EventArgs e)
{
flowLayoutPanelTextNumeric.Enabled = rbTextNumeric.Checked;
txtBoxTextFixed.Enabled = rbTextFixed.Checked;
flowLayoutPanelTextFromFile.Enabled = rbTextFromFile.Checked;
}
Ответ 5
{
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
int click = 0;
private void radioButton1_Click(object sender, EventArgs e)
{
click++;
if (click %2==1)
{
radioButton1.Checked = true;
}
if (click %2==0)
{
radioButton1.Checked = false;
}
if (radioButton1.Checked==true)
{
label1.Text = "Cheked";
}
if (radioButton1.Checked==false)
{
label1.Text = "Uncheked";
}
}
}
}
Ответ 6
Чтобы избежать этого, просто проверьте, отмечен ли radioButton
например:
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
if (radioButton1.Checked == true)
//your code
}