먼저 ComboBox (전체 코드)에서 상속 된 새 클래스를 만들어야합니다. 많은 메소드를 오버라이드 할 필요는 없습니다. 부울 속성을 추가하여 드롭 다운시기를 결정하는 데 도움을줍니다. 기능의 핵심은 OnDrawItem 메서드를 재정의하는 것입니다. 본질적으로, 귀하의 조건 (그것이 무엇이든)이 사실이라면, 콤보 상자에있는 항목을 그리지 않습니다. OnDropDown 메서드를 재정의하고 DropDownHeight = 1 (0은 유효하지 않음)을 설정해야합니다. 그렇지 않으면 콤보 상자가 여전히 정상 크기로 드롭 다운되지만 비어있는 것으로 보입니다. 콤보 상자는 여전히 떨어지지 만 높이가 단지 1 픽셀이기 때문에 그것을 볼 수 없습니다. New 메서드에서 DrawMode를 OwnerDrawFixed로 설정하여 OnDrawItem 코드가 실행되도록하는 것이 중요합니다.
항목을 표시하도록 DropDownHeight를 재설정하면 원래 높이의 저장된 값을 사용하거나 필요한 것보다 큰 임의의 큰 값으로 설정할 수 있습니다. 콤보 박스는이 높이를 자동으로 줄여 모든 항목을 표시하는 데 필요한 크기보다 크지 않도록합니다.
DrawMode를 보통으로 설정하고 OnDropDown 메서드 만 재정 의하여 작업을 단순화 할 수 있지만 OnDrawMethod는 항목 목록이 표시되는 방식 (원하는 경우)을 거의 완벽하게 제어 할 수 있습니다.
Public Class simpleCombo
Inherits ComboBox
Private _myCondition As Boolean = False
Public Property myCondition() As Boolean
Get
Return _myCondition
End Get
Set(ByVal value As Boolean)
_myCondition = value
End Set
End Property
Protected Overrides Sub OnDropDown(ByVal e As System.EventArgs)
If _myCondition Then
Me.DropDownHeight = 1
Else
Me.DropDownHeight = 200 //some arbitrarily large value
End If
MyBase.OnDropDown(e)
End Sub
Protected Overrides Sub OnDrawItem(ByVal e As System.Windows.Forms.DrawItemEventArgs)
If _myCondition Then
Return
Else
MyBase.OnDrawItem(e)
e.DrawBackground()
e.Graphics.DrawString(Me.Items(e.Index), Me.Font, New SolidBrush(Me.ForeColor), e.Bounds)
e.DrawFocusRectangle()
End If
End Sub
Public Sub New()
Me.DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed
End Sub
End Class
왜 그런 경우에는 Label/TextBox를 사용하지 않는 것이 좋을까요? DropDown에서 드롭 다운을 방지하는 것은 나에게 매우 반대 직관적 인 것으로 보이며 따라서 사용성에 좋지 않습니다. –
이 시나리오는 DropDownStyle을 Simple로 설정하는 것, 즉 ComboBox를 오버레이하는 TextBox/Label을 가질 필요성을 없애기위한 것입니다. – GenericTypeTea
DropDownStyle Simple에서는 사용자가 여전히 텍스트를 편집 할 수 있습니다. 비록 당신이 컨트롤을 사용하지 못하게 할 수 있다고 생각합니다. 스타일을 변경하고 드롭 다운을 사용 중지하거나 드롭 다운을 숨기고 라벨을 표시하는 것이 더 나은지 여부를 판단하는 것이 중요하다고 생각합니다. –