我正在尝试创建一个表单,用户必须单击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()。
有时我会检查一个选项并且按钮未启用。但是,如果我取消选中相同的选项,然后再次检查该按钮,则会启用该按钮。
我在这里迷失了......
答案 0 :(得分:0)
使用ItemCheck事件而不是SelectedIndexChanged事件。除了继承的SelectedItems和SelectedIndices之外,CheckedListBox还使用CheckedItems和CheckedIndices,因此两种类型和被触发的事件之间可能存在脱节。
答案 1 :(得分:0)
Controller.validarCampos()
用于验证多个 AbstractCampo 对象。如果第一个 AbstractCompo 对象中没有选中的项目,我认为不是您想要的,那么将抛出异常并禁用按钮。
这里的逻辑有点不对,你应该使用Validar()
的bool返回值,如果Controller.validarCampos()
为所有项目返回 false ,则Validar()
会抛出异常在 campos 。
答案 2 :(得分:0)
有几点想法:
像Mufaka所说,你应该在ItemCheck事件的处理程序中而不是SelectedIndexChanged中执行此操作。 (可以在不选择项目的情况下选中/取消选中一个框,但我不确定)。
您在以下某个条件中使用了以下内容:
checkedListBox.CheckedItems.Count == 0
在阅读documentation,here和here时,实际上有一个框可以有三种状态:
但CheckedItems属性将返回已选中或Indeterminate 的项目集合,因此,如果您的复选框以不确定/默认状态启动,则可能不是您想要的计数。
编辑:您可以按如下方式检查:
bool isAnyChecked = false;
foreach( var index in checkedListBox1.CheckedIndices )
{
if( checkedListBox1.GetItemCheckState( index ) == CheckState.Checked )
{
isAnyChecked = true;
break;
}
}