天天看點

CheckedListBox裡Disable指定項

Public Class tsCheckedListBox
    Inherits CheckedListBox
    Private _checkedAndDisabledItems As New List(Of String)()
    Private _checkedAndDisabledIndexes As New List(Of Integer)()

    Public Sub CheckAndDisable(item As String)
        _checkedAndDisabledItems.Add(item)
        Me.Refresh()
    End Sub

    Public Sub CheckAndDisable(index As Integer)
        _checkedAndDisabledIndexes.Add(index)
        Me.Refresh()
    End Sub

    Public Sub CheckAndEnable(item As String)
        _checkedAndDisabledItems.Remove(item)
        Me.Refresh()
    End Sub

    Public Sub CheckAndEnable(index As Integer)
        _checkedAndDisabledIndexes.Remove(index)
        Me.Refresh()
    End Sub

    Protected Overrides Sub OnDrawItem(e As DrawItemEventArgs)
        If Items.Count = 0 Then
            Exit Sub
        End If
        Dim s As String = Items(e.Index).ToString()

        If _checkedAndDisabledItems.Contains(s) OrElse _checkedAndDisabledIndexes.Contains(e.Index) Then
            'Dim state As System.Windows.Forms.VisualStyles.CheckBoxState = System.Windows.Forms.VisualStyles.CheckBoxState.CheckedDisabled
            Dim state As System.Windows.Forms.VisualStyles.CheckBoxState = System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedDisabled
            If GetItemChecked(e.Index) Then
                state = System.Windows.Forms.VisualStyles.CheckBoxState.CheckedDisabled
            End If
            Dim glyphSize As Size = CheckBoxRenderer.GetGlyphSize(e.Graphics, state)
            ' 畫Checkbox
            CheckBoxRenderer.DrawCheckBox(e.Graphics, New Point(e.Bounds.X + 1, e.Bounds.Y + 1), New Rectangle(New Point(e.Bounds.X + glyphSize.Width + 3, e.Bounds.Y), New Size(e.Bounds.Width - glyphSize.Width, e.Bounds.Height)), s, Me.Font, TextFormatFlags.Left, _
                False, state)
        Else
            MyBase.OnDrawItem(e)
        End If
    End Sub
    ' 點選無效處理
    Protected Overrides Sub OnItemCheck(e As ItemCheckEventArgs)
        If Items.Count = 0 Then
            Exit Sub
        End If
        Dim s As String = Items(e.Index).ToString()
        If _checkedAndDisabledItems.Contains(s) OrElse _checkedAndDisabledIndexes.Contains(e.Index) Then
            e.NewValue = e.CurrentValue
        End If
    End Sub

    Public Sub ClearDisabledItems()
        _checkedAndDisabledIndexes.Clear()
        _checkedAndDisabledItems.Clear()
        Me.Refresh()
    End Sub

End Class
           

繼續閱讀