2009-06-23 4 views
3

콤보 상자의 드롭 다운 부분을 비활성화하는 쉬운 방법이 있습니까? 일부 시나리오에서 사용자가 드롭 다운 부분의 항목을 보지 못하도록하고 싶습니다.콤보가 드롭 다운되는 것을 방지

EDIT 이렇게 빨리 대답 모든

감사합니다!

나는 이미 콤보 상자와 같은 위치에 텍스트 상자 나 레이블을 배치 한 다음 필요에 따라 콤보 상자를 숨기는 옵션을 고려했지만 복잡성 때문에 아이디어를 기각했습니다 (상당히 많은 콤보가 있음). 양식에). 또한 Simple 모드를 살펴 보았지만 콤보의 드롭 다운 버튼 부분이 제거되었습니다. 내가 정말로 찾고자하는 것은 콤보를 비활성화하는 것입니다. 그러나 비활성화 된 것처럼 보이지 않고 사용자가 표시된 데이터를 선택할 수 있도록합니다 (예 : 복사 및 붙여 넣기 작업).

+0

왜 그런 경우에는 Label/TextBox를 사용하지 않는 것이 좋을까요? DropDown에서 드롭 다운을 방지하는 것은 나에게 매우 반대 직관적 인 것으로 보이며 따라서 사용성에 좋지 않습니다. –

+0

이 시나리오는 DropDownStyle을 Simple로 설정하는 것, 즉 ComboBox를 오버레이하는 TextBox/Label을 가질 필요성을 없애기위한 것입니다. – GenericTypeTea

+0

DropDownStyle Simple에서는 사용자가 여전히 텍스트를 편집 할 수 있습니다. 비록 당신이 컨트롤을 사용하지 못하게 할 수 있다고 생각합니다. 스타일을 변경하고 드롭 다운을 사용 중지하거나 드롭 다운을 숨기고 라벨을 표시하는 것이 더 나은지 여부를 판단하는 것이 중요하다고 생각합니다. –

답변

0

사용자가 다른 값을 보거나 선택할 수 없게하려는 경우 드롭 다운을 숨기고 대신 정적 텍스트 컨테이너를 표시해야합니다. 상표.

1

당신은 방금 DropDownStyle을 간단하게 설정 했습니까? WinForms를 만난 지 오래되었지만 원하는 것을 올바르게 기억한다면.

편집 : 당신이이 DropDownStyle 속성을 사용하여 제어 할 수 있습니다

dropDownList.DropDownStyle = ComboBoxStyle.Simple; 
4

(안 드롭 이벤트하지만 ... 그건 너무 늦기). 그러면 콤보 상자가 텍스트 상자로 나타납니다.

if (DropDownShouldBeVisible()) 
{ 
    comboBox.DropDownStyle = ComboBoxStyle.DropDownSimple; 
} 
else 
{ 
    comboBox.DropDownStyle = ComboBoxStyle.Simple; 
} 

그러나이 경우 화살표 키를 사용하여 목록의 값을 선택할 수 있습니다. Konrad가 제안한 것과 같은 위치에서 다른 적절한 컨트롤로 교체하십시오.

0

나는 Konrad Rudolph 코멘트에 동의합니다. 텍스트 상자를 같은 위치에 놓고 콤보 및 텍스트 상자 가시성 속성을 true 또는 false로 설정할 수 있습니다.

0

Enabled을 false로 설정 - 사용자가 값을 선택할 수 없습니다. 목록이 삭제되는 것을 막을 수있는 또 다른 방법이 없기 때문에 내가 생각할 수있는 유일한 대안은 모든 항목을 일시적으로 제거한 다음 나중에 다시 추가하는 것입니다.

1

간단히 설정 한 다음 키를 눌러도됩니다.

private void dropDownList_KeyPress(object sender, KeyPressEventArgs e) 
{ 

    if (dropDownList.DropDownStyle == ComboBoxStyle.Simple) 
    { 
    e.Handled = true; 
    } 

} 
5

먼저 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 
1

다시 가능하게 ComboBox를 다음 비활성화하여 Control.Enter 이벤트를 처리하는 나를 위해 일한 및했습니다 솔루션입니다.

private void myComboBox_Enter(object sender, EventArgs e) 
{ 
    // Do some stuff 
    myComboBox.Enabled = false; 
    myComboBox.Enabled = true; 
} 

사용자가 ComboBox을 클릭하거나 탭하면이 기능이 작동합니다.

관련 문제