web-dev-qa-db-fra.com

Gestionnaire d'événements pour groupe Box avec boutons radio en C #

J'ai quelques radionButtons dans groupBox et je dois agir comme ce que je pourrais appeler "un des radiobuttons.checked changé" ou savoir à partir du radiobutton quel index est modifié. J'ai essayé de le trouver dans la liste des événements, mais je ne trouvais pas le bon. 

Edit: Pour que ce soit plus clair: je dois savoir s’il existe un handel pour ce que j’écrirai comme méthode de traitement pour goupBox et non pour single radioButton. Je sais comment utiliser radiButton.checkedChanged, mais ce n'est pas ce que je découvre. groupBox. Je trouve gestionnaire "dans la zone de groupe est quelque chose qui se passe" ou similaire s'il en existe.

C’est dans WFA (Application de présentation Windows) dans Visual studio 2012.

10
user1097772

Je pense que ce que vous voulez faire est de relier tous les événements CheckedChanged des boutons Radio au même gestionnaire.

public Form1()
{
    radioButton1.CheckedChanged += new EventHandler(radioButtons_CheckedChanged);
    radioButton2.CheckedChanged += new EventHandler(radioButtons_CheckedChanged);

    // ...
}

private void radioButtons_CheckedChanged (object sender, EventArgs e)
{
    RadioButton radioButton = sender as RadioButton;

    if (radioButton1.Checked)
    {
        // Do stuff 
    }
    else if (radioButton2.Checked)
    {
        // Do other stuff
    }
}
28
davenewza

Rien n'est prévu pour ça autant que je sache.

Définissez la propriété tag sur une sorte d'indicateur (0 à n).

Ajouter un CheckChangedHandler

Pointez tous les boutons CheckChanged sur les événements.

alors quelque chose comme.

private void radioButtons_CheckedChanged (object sender, EventArgs e) 
{     
  RadioButton radioButton = sender as RadioButton;      
  int buttonid = (int)radioButton.Tag;
  switch (buttonid)
  {
    case 0 : // do something; break
  }
} 

Si vous en avez quelques-unes, je regarderais un composant de radiogroupe.

5
Tony Hopkinson

J'ai eu le même problème: une boîte nommée Type de bouton (gbxButtonType) avec 6 boutons radio et une autre boîte nommée Type d'icône (gbxIconType) avec 8 bouton radio. Lorsque l'utilisateur sélectionne un bouton radio dans chaque zone de groupe, un MessageBox apparaît avec la sélection appliquée après avoir cliqué sur DisplayButton . Mon problème était que les zones de groupe n'avaient pas d'événement CheckedChanged. La solution de AKN a parfaitement fonctionné:

public Form1()
    {
        InitializeComponent();

        for (int i = 0; i < gbxButtonType.Controls.Count; i++)
        {
            RadioButton rdb = (RadioButton)gbxButtonType.Controls[i];
            rdb.CheckedChanged += new System.EventHandler(gbxButtonType_CheckedChanged);
        }

        for (int i = 0; i < gbxIconType.Controls.Count; i++)
        {
            RadioButton rdb = (RadioButton)gbxIconType.Controls[i];
            rdb.CheckedChanged += new System.EventHandler(gbxIconType_CheckedChanged);
        }
    }

private void gbxIconType_CheckedChanged(object sender, EventArgs e)
    {
        if (sender == rdbAsterisk)
        {
            iconType = MessageBoxIcon.Asterisk;
        }
        else if (sender == rdbError)
        {
            iconType = MessageBoxIcon.Error;
        }
        ...
        else
        {
            iconType = MessageBoxIcon.Warning;
        }
   }
2
Emanuel

Semblable à la réponse de davenewza (et aurait probablement dû être un commentaire, mais ma réputation est insuffisante), mais l'événement n'a été déclenché qu'une seule fois pour tout le groupe de boutons radio.

public Form1()
{
    // Add a "CheckedChanged" event handler for each radio button.
    // Ensure that all radio buttons are in the same groupbox control.
    radioButton1.CheckedChanged += new EventHandler(radioButtons_CheckedChanged);
    radioButton2.CheckedChanged += new EventHandler(radioButtons_CheckedChanged);
}

private void radioButtons_CheckedChanged (object sender, EventArgs e)
{
    // Do stuff only if the radio button is checked (or the action will run twice).
    if (((RadioButton)sender).Checked)
    {
        if (((RadioButton)sender) == radioButton1)
        {
            // Do stuff 
        }
        else if (((RadioButton)sender) == radioButton2)
        {
            // Do other stuff
        }
    }
}
2
adamj537

// Ici vous allez avec la permission de Jock Frank Halliday 

     //^subscribe events to radio button check changed 
    private void seriesTxtBxEvent()
    {
        //Show txtBx
        this.radBtn_RoomSeries.CheckedChanged += new EventHandler(showSeriesTxtBx_Event);
        //Hide txtBx
        this.radBtn_RoomNumber.CheckedChanged += new EventHandler(hideSeriesTxtBx_Event);
        this.radBtn_RoomName.CheckedChanged += new EventHandler(hideSeriesTxtBx_Event);
        this.radBtn_RoomLevel.CheckedChanged += new EventHandler(hideSeriesTxtBx_Event);
        this.radBtn_RoomDep.CheckedChanged += new EventHandler(hideSeriesTxtBx_Event);
    }



    private void hideSeriesTxtBx_Event(object sender, EventArgs e)
    {
        tbx_SheetSeries.Visible = false;
    }


    private void showSeriesTxtBx_Event(object sender, EventArgs e)
    {
        tbx_SheetSeries.Visible = true;
    }
1

Je pense que vous souhaitez gérer la sélection de certains boutons radio dans une groupbox à l'aide du contrôle de groupbox lui-même .

Peut-être que vous vouliez essentiellement éviter la répétition de code.

(c'est-à-dire) l'ajout d'un événement de vérification de changement pour tous les boutons radio du concepteur, ce qui peut s'avérer fastidieux lorsqu'il y a plus de contrôle. Comme il est déjà présent dans un groupe, pourquoi ne pas utiliser l'objet de contrôle de groupe en elle et définir les événements.

C'est ainsi que j'ai compris votre problème et par conséquent la solution indiquée ci-dessous.

Définir un gestionnaire commun pour tous les contrôles de bouton radio dans la zone de groupe

for (int i = 0; i < groupBox.Controls.Count; i++)
{
    RadioButton rb = (RadioButton)groupBox.Controls[i];
    rb.CheckedChanged += new System.EventHandler(evntHandler);
}

Dans le gestionnaire, vous pouvez déterminer quel bouton a été modifié comme indiqué par d'autres et effectuer les actions nécessaires.

1
AKN

System.Windows.Forms.RadioButton.CheckedChanged

est l'événement dont vous avez besoin

Alors fais quelque chose comme: 

    public Form1()
    {
        InitializeComponent();

        this.radioButton1.CheckedChanged += new EventHandler(radioButton1_CheckedChanged);
    }

    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        // your action
    }
1
Big Endian

Vous pouvez peut-être le faire avec Timer, mais c'est mauvais pour l'optimisation, la solution facile est que pour chaque bouton radio, vous ajoutez simplement une seule fonction en tant qu'événement ONCheckedChanged.

0
János Márk Kirsch

Groupbox limitera un seul bouton radio coché

So Setp1: vous pouvez assigner un gestionnaire d’événements "CheckedChanged" à tous

private void initRadio()
{
        radio_button1.CheckedChanged += Radio_show_CheckedChanged;
        radio_button2.CheckedChanged +=Radio_show_CheckedChanged;
}

Et Setp2: implémente ce gestionnaire d'événements comme ceci (Filtrer par le texte du bouton radio)

private void Radio_show_CheckedChanged(object sender, EventArgs e)
{
    RadioButton radioButton = sender as RadioButton;
    if (radioButton.Checked == true) { //limited only checked button do function
        switch (radioButton.Text)
        {
            case "name1":
                // do your stuff ...
                break;
            case "name2":
                // do your stuff ...
                break;
        }
    }
}
0
Li Kevin
//Form Start

void MainFormLoad(object sender, EventArgs e)
{

    Control.ControlCollection locais =  groupBoxLocalização.Controls;

        foreach (CheckBox chkBox in locais)
        {
            chkBox.MouseUp += chkBoxLocais_MouseUp;
        }
}

// Event
void chkBoxLocais_MouseUp(object sender, MouseEventArgs e)
{

    //Tratar individualmente
    CheckBox chk = (CheckBox)sender;

    //ou para tratar todos objetos de uma vez

    Control.ControlCollection locais =  groupBoxLocalização.Controls;
    foreach (CheckBox chkBox in locais) {
        //chkBox....
    }

}
0
Paulo Cesar