0

一種の「次へ」ボタンを有効にするために、ユーザーが ListCheckBox で指定されたオプションの少なくとも 1 つのオプションをクリックする必要があるフォームを実行しようとしています。

ただし、オプションが選択されていないときにボタンが有効になる場合があるため、期待どおりに機能しません。

これは、検証を行うクラスのコードです。

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

A couple of thoughts:

  1. Like Mufaka said, you should probably be doing this inside a handler for the ItemCheck event instead of SelectedIndexChanged. (It might be possible to check/uncheck a box without selecting the item, but I'm not sure).

  2. You have used the following in one of your conditions:

    checkedListBox.CheckedItems.Count==0

    In reading the documentation, here, and here, there are actually three states a box can be in:

    • Checked
    • Unchecked
    • Indeterminate

    But the CheckedItems property will return the collection of items that are Checked or Indeterminate, so if your checkboxes start in the indeterminate/default state this might not be the count that you want.


edit: You can check as follows:

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

Controller.validarCampos()複数のAbstractCampoオブジェクトを検証することです。最初のAbstractCompoオブジェクトにチェックされたアイテムがないと、例外がスローされ、ボタンが無効になります。

ここではロジックが少し間違っています。 bool の戻り値を使用する必要があり、 camposのすべてのアイテムに対してfalseを返す場合は例外をスローする必要がありValidar()ます。Controller.validarCampos()Validar()

于 2013-06-18T03:29:48.277 に答える
0

SelectedIndexChanged イベントの代わりにItemCheckイベントを使用します。CheckedListBox は、継承された SelectedItems と SelectedIndices に加えて、CheckedItems と CheckedIndices を使用するため、2 つのタイプと発生するイベントとの間に切断がある可能性があります。

于 2013-06-18T01:01:57.307 に答える