Как проверить наличие нескольких флажков в флажках - PullRequest
0 голосов
/ 22 февраля 2019

Это схема процесса, которого я хочу достичь:

выбрать опции из списка проверенных списков ----> сравнить индексы отмеченных предметов с определенным набором индексов.

ВДругими словами, я пытаюсь увидеть, были ли проверены несколько индексов / элементов.

Мне также интересно, можно ли выполнить эту задачу одновременно для нескольких проверенных списков.

1 Ответ

0 голосов
/ 22 февраля 2019

Не существует автоматического метода, предоставляющего вам необходимую информацию.Но вы, конечно, можете сделать это самостоятельно.Например, метод расширения может быть создан для проверки наличия или отсутствия указанных вами индексов.

    static class CheckedListBoxExtension {
        public static bool ContainsSet(this WinForms.CheckedListBox cbl, ICollection<int> values)
        {
            var valueSet = new HashSet<int>( values );

            foreach(int index in cbl.CheckedIndices) {
                if ( valueSet.Contains( index ) ) {
                    valueSet.Remove( index );

                }
            }

            return valueSet.Count == 0;
        }
    }

Тогда вы можете использовать его следующим образом:

if ( this.checkBoxes.ContainsSet( new int[]{ 2, 4 } ) ) {
            // Your code here...
}

Ниже приведен полный пример:

class Window: WinForms.Form {
    public Window()
    {
        this.Build();
        this.MinimumSize = new Drawing.Size( 320, 200 );
    }

    void Build()
    {
        this.status = new WinForms.TextBox { Dock = WinForms.DockStyle.Bottom };
        this.checkBoxes = new WinForms.CheckedListBox {
            Dock = WinForms.DockStyle.Fill 
        };

        for(int i = 1; i <= 10; ++i) {
            this.checkBoxes.Items.Add(
                char.ToString( (char) ( 'a' + i ) ),
                false
            );
        }

        this.checkBoxes.SelectedIndexChanged += (sender, e) => this.UpdateCheckedList();
        this.Controls.Add( this.checkBoxes );
        this.Controls.Add( this.status );
    }

    void UpdateCheckedList()
    {
        string strStatus = "";

        if ( this.checkBoxes.ContainsSet( new int[]{ 2, 4 } ) ) {
            strStatus += "YES";
        }

        this.status.Text = strStatus;
    }

    WinForms.CheckedListBox checkBoxes;
    WinForms.TextBox status;
}

static class CheckedListBoxExtension {
    public static bool ContainsSet(this WinForms.CheckedListBox cbl, ICollection<int> values)
    {
        var valueSet = new HashSet<int>( values );

        foreach(int index in cbl.CheckedIndices) {
            if ( valueSet.Contains( index ) ) {
                valueSet.Remove( index );

            }
        }

        return valueSet.Count == 0;
     }
}

Надеюсь, это поможет.

(PS. Visual Basic .NET следует)

Imports System.Runtime.CompilerServices

Class Window
    Inherits WinForms.Form

    Public Sub New()
        Me.Build()
        Me.MinimumSize = New Drawing.Size(320, 200)
    End Sub

    Private Sub Build()
        Me.status = New WinForms.TextBox With {
            .Dock = WinForms.DockStyle.Bottom
        }
        Me.checkBoxes = New WinForms.CheckedListBox With {
            .Dock = WinForms.DockStyle.Fill
        }

        For i As Integer = 1 To 10
            Me.checkBoxes.Items.Add(Char.ToString(ChrW(("a"c + i))), False)
        Next

        Me.checkBoxes.SelectedIndexChanged += Function(sender, e) Me.UpdateCheckedList()
        Me.Controls.Add(Me.checkBoxes)
        Me.Controls.Add(Me.status)
    End Sub

    Private Sub UpdateCheckedList()
        Dim strStatus As String = ""

        If Me.checkBoxes.ContainsSet(New Integer() {2, 4}) Then
            strStatus += "YES"
        End If

        Me.status.Text = strStatus
    End Sub

    Private checkBoxes As WinForms.CheckedListBox
    Private status As WinForms.TextBox
End Class

Module CheckedListBoxExtension
    <Extension()>
    Function ContainsSet(ByVal cbl As WinForms.CheckedListBox, ByVal values As ICollection(Of Integer)) As Boolean
        Dim valueSet = New HashSet(Of Integer)(values)

        For Each index As Integer In cbl.CheckedIndices

            If valueSet.Contains(index) Then
                valueSet.Remove(index)
            End If
        Next

        Return valueSet.Count = 0
    End Function
End Module
...