2011-03-27 2 views
3

일반적인 채색이있는 Windows Forms 콤보 상자를 만들려하고 드롭 다운 목록을 표시 할 수 있지만 값을 실제로 변경할 수는 없습니다. 내가 알 수있는 한, 모든 조언은 콤보 상자의 대화 형 기능을 사용하지 않도록 설정 한 것 같으므로 How to make Combobox in winforms readonly의 복제본이 아닙니다.읽기 전용 (그러나 droppable) ComboBox

내 이론적 근거 : 모든 컨트롤이 읽기 전용 인 양식이 있으며 응용 프로그램의 특성상 콤보 상자의 값이 변경되지 않으면 사용자가 혼란에 빠질 위험이 없다고 생각합니다. . 나는 사용자가 콤보 상자가 바인딩 된 열거 형의 가능한 모든 값을 볼 수 있기를 바랍니다. 내가 지금까지 무엇을 가지고

는 아주 나쁜 해킹 :

public partial class ReadOnlyComboBox : ComboBox 
{ 
    int prevIndex = -1; 

    public ReadOnlyComboBox() 
    { 
     InitializeComponent(); 
    } 

    private void ReadOnlyComboBox_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (prevIndex <= 0) 
      prevIndex = SelectedIndex; 
     else 
      SelectedIndex = prevIndex; 
    } 
} 

효과,이 프레임 워크에서 가짜 "0"값을 무시하고 바인딩 소스로부터 획득 한 최초의 비 - 제로 값을 사용합니다. 즉각적인 단점은 값을 한 번만 설정할 수 있으며 바인딩 된 열거 형은 1부터 시작해야한다는 것입니다.

이 문제를 정리하는 방법에 대한 조언은 언제나 환영합니다. 감사.

+2

에서, "DropDownStyle"속성을 사용하여 일반 콤보가 "DropDownList로"로 설정 명확하게하기 위해 올바른, 당신이 원하는 아닌가요? – Inisheer

+0

사실 나는 위의 내용 외에도 DropDownList를 원합니다. – Reinderien

+0

그래, DropDownList는 편집 할 수없는 항목을 표시합니다. 변경을 막으려면 어떻게 원래 채워지는 ... 상태/진행중인 작업 업데이트와 같은 다른 프로세스에서? 또는 사용자가 레코드를 처음 만들 때 편집 할 수있게하고 초기 생성 값 설정 후 사용자가 변경하지 못하도록 하시겠습니까? – DRapp

답변

1

사용 DropDownClosed 이벤트가

public class ReadOnlyComboBox : ComboBox 
{ 
    bool afterDropDown ; 
    int prevIndex; 

    public ReadOnlyComboBox() 
    { 
     this.SelectedIndexChanged+=new EventHandler(ReadOnlyComboBox_SelectedIndexChanged); 
     this.DropDownClosed += new EventHandler(ReadOnlyComboBox_DropDownClosed); 
    } 

    void ReadOnlyComboBox_DropDownClosed(object sender, EventArgs e) 
    { 
     afterDropDown = true; 
    } 

    private void ReadOnlyComboBox_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (afterDropDown) 
     { 
      afterDropDown = false; 
      SelectedIndex = prevIndex; 
     } 
     else 
     { 
      prevIndex = SelectedIndex; 
     } 
    } 
} 
+0

이것은 기존 솔루션과 비슷하지만 단점은 목록을 한 번만 채울 수 있다는 것입니다. 이상 적으로 필자는 필요에 따라 바인딩을 통해 변경할 수 있도록하고 싶지만 사용자 편집을 금지하고 싶습니다. – Reinderien

+0

@Reinderien 업데이트를 참조하십시오. – Avram

+0

여전히 꽤 못생긴 해킹이지만 아무것도없는 것보다 낫습니다. – Reinderien