如果ListCheckBox中至少有一个选中的项目,则启用按钮

时间:2013-06-18 00:31:40

标签: c# winforms

我正在尝试创建一个表单,用户必须单击ListCheckBox上给出的至少一个选项才能启用某种“下一步”按钮。

但是,它没有按预期工作,因为有时候按钮是在没有选择的情况下启用的。

这是我进行验证的类的代码:

class CampoCheckedListBox : AbstractCampo
{
    private CheckedListBox checkedListBox { get; set; }
    private string nombre { get; set; }
    private bool obligatorio { get; set; }

    public CampoCheckedListBox(string nom, CheckedListBox controller, bool oblig)
    {
        this.checkedListBox = controller;
        this.nombre = nom;
        this.obligatorio = oblig;
    }

    public override void validar()
    {
        string mensaje = "";

        if (this.obligatorio && checkedListBox.CheckedItems.Count==0)
        {
            mensaje += "-Seleccione al menos una de las opciones de " + this.nombre + "." + Environment.NewLine;
            throw new ValidationException(mensaje);
        }

    }
}

以我的形式:

    private void validarCampos()
    {
        List<AbstractCampo> campos = new List<AbstractCampo>();
        campos.Add(new Campo("Nombre", tBoxRol.Text, true, Controller.TipoValidacion.Alfanumerico));
        campos.Add(new CampoCheckedListBox("Funcionalidades", chkBoxFuncionalidades, true));
        try
        {
            Controller.validarCampos(campos);
            darAlta_button.Enabled = true;
            errorBox.Text = "";
        }
        catch (ValidationException vEx)
        {
            errorBox.Text = vEx.mensaje;
            darAlta_button.Enabled = false;
        }
    }

Controller.validarCampos()只从列表中获取每个对象并发送消息validar(); 我在ListCheckBox的SelectedIndexChanged事件中调用此validarCampos()。

有时我会检查一个选项并且按钮未启用。但是,如果我取消选中相同的选项,然后再次检查该按钮,则会启用该按钮。

我在这里迷失了......

3 个答案:

答案 0 :(得分:0)

使用ItemCheck事件而不是SelectedIndexChanged事件。除了继承的SelectedItems和SelectedIndices之外,CheckedListBox还使用CheckedItems和CheckedIndices,因此两种类型和被触发的事件之间可能存在脱节。

答案 1 :(得分:0)

Controller.validarCampos()用于验证多个 AbstractCampo 对象。如果第一个 AbstractCompo 对象中没有选中的项目,我认为不是您想要的,那么将抛出异常并禁用按钮。

这里的逻辑有点不对,你应该使用Validar()的bool返回值,如果Controller.validarCampos()为所有项目返回 false ,则Validar()会抛出异常在 campos

答案 2 :(得分:0)

有几点想法:

  1. 像Mufaka所说,你应该在ItemCheck事件的处理程序中而不是SelectedIndexChanged中执行此操作。 (可以在不选择项目的情况下选中/取消选中一个框,但我不确定)。

  2. 您在以下某个条件中使用了以下内容:

      

    checkedListBox.CheckedItems.Count == 0

    在阅读documentationherehere时,实际上有一个框可以有三种状态:

    • 经过
    • 未检查
    • 不确定


    但CheckedItems属性将返回已选中或Indeterminate 的项目集合,因此,如果您的复选框以不确定/默认状态启动,则可能不是您想要的计数。


  3. 编辑:您可以按如下方式检查:

    bool isAnyChecked = false; 
    foreach( var index in checkedListBox1.CheckedIndices ) 
    { 
      if( checkedListBox1.GetItemCheckState( index ) == CheckState.Checked ) 
      { 
        isAnyChecked = true; 
        break; 
      } 
    }