Controlador de eventos ItemChecked

Estoy usando el siguiente código para limitar la cantidad de elementos marcados en un CheckedListBox a 1:

        private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        if (checkedListBox1.CheckedItems.Count == 1)
        {
            Boolean isCheckedItemBeingUnchecked = (e.CurrentValue == CheckState.Checked);
            if (isCheckedItemBeingUnchecked)
            {
                e.NewValue = CheckState.Checked;
            }
            else
            {
                Int32 checkedItemIndex = checkedListBox1.CheckedIndices[0];
                checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
                checkedListBox1.SetItemChecked(checkedItemIndex, false);
                checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
            }
            return;
        }
    }

Pero hay ocasiones en las que necesito borrar todos los elementos marcados. Estoy usando el siguiente código para intentar hacer eso, pero el evento anterior impide que funcione. ¿Cómo puedo lograr eso? Gracias.

    public void ClearChecked()
    {
        foreach (int checkedItemIndex in checkedListBox1.CheckedIndices)
        {
            checkedListBox1.SetItemChecked(checkedItemIndex, false);
        }
    }

preguntado el 22 de mayo de 12 a las 14:05

Anule la suscripción al evento primero y luego llame a Clear Checked. O cree una variable de instancia que indique cuándo ignorar el evento de cambio de elemento. -

Me pregunto por qué no está simplemente usando un ListBox desde el cual solo se puede seleccionar 1 valor... -

3 Respuestas

Podría crear una nueva variable que indique cuándo se debe ignorar el evento ItemCheck:

private shouldIgnoreCheckEvent;

public void ClearChecked()
{
    this.shouldIgnoreCheckEvent = true;

    foreach (int checkedItemIndex in checkedListBox1.CheckedIndices)
    {
        checkedListBox1.SetItemChecked(checkedItemIndex, false);
    }

    this.shouldIgnoreCheckEvent = false;
}

y actualice su método ItemCheck para verificar si debe ignorarse o no:

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    if (!this.shouldIgnoreCheckEvent && checkedListBox1.CheckedItems.Count == 1)
    {
        Boolean isCheckedItemBeingUnchecked = (e.CurrentValue == CheckState.Checked);
        if (isCheckedItemBeingUnchecked)
        {
            e.NewValue = CheckState.Checked;
        }
        else
        {
            Int32 checkedItemIndex = checkedListBox1.CheckedIndices[0];
            checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
            checkedListBox1.SetItemChecked(checkedItemIndex, false);
            checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
        }
        return;
    }
}

contestado el 22 de mayo de 12 a las 14:05

Esto debería borrar todos los elementos marcados:

 public void UncheckCheckBoxItems(CheckBoxList cbl)
 {
     foreach (ListItem item in cbl.Items)
     {
         item.Selected = false;
     }
 }

contestado el 22 de mayo de 12 a las 14:05

CheckBoxList! = CheckedListBox y WinForms! = WPF. - Steve

La forma más sencilla es desconectar el controlador de eventos ItemChecked, desmarcar y luego volver a conectar el controlador de eventos. De esta manera, cuando llame a SetItemChecked, no se activará ningún evento ItemChecked y no necesitará ningún código adicional para controlar su controlador de eventos. Acabo de notar que ya está usando este patrón dentro de su evento ItemCheck.

public void ClearChecked()     
{         
     try
     {
         checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
         foreach (int checkedItemIndex in checkedListBox1.CheckedIndices)         
         {             
             checkedListBox1.SetItemChecked(checkedItemIndex, false);         
         }
     }
     finally
     {
         checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;

     }     
} 

Try/finally es importante porque, en caso de excepciones, su controlador de eventos se volverá a conectar.

contestado el 22 de mayo de 12 a las 14:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.