0

我正在尝试做一个表单,用户必须单击 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()。

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

我在这里很迷失......

4

3 回答 3

0

Controller.validarCampos()是验证多个AbstractCampo对象。如果第一个AbstractCompo对象中没有选中的项目,我认为这不是您想要的,则会引发异常并且按钮将被禁用。

这里的逻辑有点错误,你应该使用 bool 返回值,Validar()如果campos中的所有项目返回falseController.validarCampos() ,则应该抛出异常。Validar()

于 2013-06-18T03:29:48.277 回答
0

几个想法:

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

  2. 您在其中一种情况下使用了以下内容:

    checkedListBox.CheckedItems.Count==0

    在阅读文档herehere时,盒子实际上可以处于三种状态:

    • 已检查
    • 未选中
    • 不定

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


编辑:您可以检查如下:

bool isAnyChecked = false; 
foreach( var index in checkedListBox1.CheckedIndices ) 
{ 
  if( checkedListBox1.GetItemCheckState( index ) == CheckState.Checked ) 
  { 
    isAnyChecked = true; 
    break; 
  } 
}
于 2013-06-18T03:43:05.297 回答
0

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

于 2013-06-18T01:01:57.307 回答