webentwicklung-frage-antwort-db.com.de

Das Optionsfeld "Geändertes Ereignis aktiviert" wird zweimal ausgelöst

Bitte lesen Sie meine Frage, es ist kein Duplikat.

Ich habe drei Optionsfelder in Windows Form und alle diese Schaltflächen haben ein gemeinsames 'CheckedChanged'-Ereignis. Wenn ich auf eines dieser Optionsfelder klicke, wird das Ereignis "CheckedChanged" zweimal ausgelöst.

Hier ist mein Code:

private void radioButtons_CheckedChanged(object sender, EventArgs e)
{
    //My Code
}

Ich habe den Haltepunkt eingefügt und der gesamte Code innerhalb dieses Ereignisses wird zweimal wiederholt. Bitte sagen Sie mir, warum es sich so verhält.

28

Wie die anderen Antwortenden zu Recht sagen, wird das Ereignis zweimal ausgelöst, da jedes Mal, wenn ein RadioButton innerhalb einer Gruppe markiert ist, ein anderer nicht markiert ist - daher wird das markierte geänderte Ereignis zweimal ausgelöst.

Um innerhalb dieses Ereignisses nur für den gerade ausgewählten RadioButton zu arbeiten, können Sie sich das Sender-Objekt ansehen und folgendermaßen vorgehen:

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);
        }
    }
}
63
David Hall

Um dies zu vermeiden, überprüfen Sie einfach, ob radioButton aktiviert ist

beispielsweise:

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
    if (radioButton1.Checked == true)
        //your code
}
5
jaleel

CheckedChanged wird ausgelöst, wenn sich die Checked-Eigenschaft ändert. Wenn Sie einen RadioButton auswählen, wird der zuvor ausgewählte RadioButton deaktiviert (fired CheckedChanged) und der neue RadioButton aktiviert (fired CheckedChanged).

4
kmatyaszek

Es wird einmal für den Wechsel der Optionsschaltfläche von aktiviert zu deaktiviert und erneut für den Wechsel der Optionsschaltfläche von deaktiviert zu aktiviert ausgelöst (d. H. Jede Änderung des aktivierten Status löst das Ereignis aus).

Sie können die AutoCheck-Eigenschaft für jeden RadioButton auf true setzen und dann das Click-Ereignis anstelle des CheckChanged-Ereignisses abfangen. Dies würde sicherstellen, dass nur ein Ereignis ausgelöst wird, und die Logik im Handler kann den Absender so umwandeln, dass er RadioButton eingibt, falls dies zur Verarbeitung des Klicks erforderlich ist. Oft kann die Besetzung vermieden werden, wenn die Handlerlogik einfach ist. Hier ist ein Beispiel, das drei Steuerelemente behandelt, rbTextNumeric, rbTextFixed und rbTextFromFile:

        private void rbText_Click(object sender, EventArgs e)
    {
       flowLayoutPanelTextNumeric.Enabled = rbTextNumeric.Checked;
       txtBoxTextFixed.Enabled = rbTextFixed.Checked;
       flowLayoutPanelTextFromFile.Enabled = rbTextFromFile.Checked;
    }
0
Steve Stover
{
    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";
            }
        }

    }
}
0
Emin