Member 13138523 Ответов: 1

Использовать управления contextmenustrip с списке checkedlistbox - не элементы в списке, но сам списке checkedlistbox


У меня возникли проблемы с получением моего contextmenustrip, чтобы дать мне результаты, которые я хочу.

Я хочу иметь возможность отключать/включать мои checkedlistboxes по мере необходимости. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу заставить свой contextmenustrip работать с самим listbox, чтобы он стал фокусом элемента управления, я должен щелкнуть элемент, который затем выделит его и установит флажок (я определенно не хочу этого)

Другая проблема заключается в том, что когда listbox отключен, он не позволяет мне повторно включить его с помощью contextmenustrip.

Кроме того, если бы кто - то мог сказать мне, как остановить выделение элементов в моем checkedlistbox, я был бы очень признателен-даже если вы снимите флажок с элемента, он все равно останется выделенным, что крайне раздражает.

Что я уже пробовал:

Private Sub MarkCrewInactiveToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles MarkCrewInactiveToolStripMenuItem.Click
        If TypeOf Me.ActiveControl Is CheckedListBox Then
            Dim objControl As CheckedListBox = Me.ActiveControl
            ActiveControl.BackColor = SystemColors.ActiveBorder
            ActiveControl.Enabled = False
        End If
    End Sub

    Private Sub MarkCrewActiveToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles MarkCrewActiveToolStripMenuItem.Click
        If TypeOf Me.ActiveControl Is CheckedListBox Then
            Dim objControl As CheckedListBox = Me.ActiveControl
            ActiveControl.BackColor = SystemColors.Window
            ActiveControl.Enabled = True
        End If

    End Sub

Maciej Los

Когда какой-то фрагмент кода используется более одного раза, вы должны переместить его в другую подпрограмму (с параметрами или без них). Взгляните на свой код, единственное отличие - это BackColor и состояние включенного свойства.

1 Ответов

Рейтинг:
4

Maciej Los

Пожалуйста, сначала прочтите мой комментарий к этому вопросу. Я уже упоминал там о хорошей практике программирования. Таким образом, ваш код может быть изменен на:

Private Sub MarkCrewActiveToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles MarkCrewActiveToolStripMenuItem.Click, MarkCrewInactiveToolStripMenuItem.Click

Dim tsmi As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
If tsmi IsNot Nothing Then
    Dim myarg As Integer = If(tsmi.Name = "MarkCrewInactiveToolStripMenuItem", -1, 0)
    UnCheckCheckedListBox(myarg)
End If

End Sub


Private Sub UnCheckCheckedListBox(Optional ByVal action As Integer = 0)

If TypeOf Me.ActiveControl Is CheckedListBox Then
    Dim objControl As CheckedListBox = Me.ActiveControl
    objControl.BackColor = If(action=0, SystemColors.ActiveBorder, SystemColors.Window)
    objControl.Enabled = action
    Me.Focus
End If

End Sub


Что касается вашего главного вопроса...
Кажется, вы должны переместить фокус на другой элемент управления или отключить выделение[^]...


Maciej Los

Примечание: приведенный выше код был написан "ad-hoc", поэтому он может содержать опечатки и т. д.