2011-04-01 4 views
4

Windows 양식에서 회색으로 표시하지 않고 콤보 상자의 값 변경을 비활성화하는 방법이 있습니까? 몇 가지 게시물을 보았지만 WPF 용이었고 제 상황에 도움이되지 못했습니다. 에 이러한 설정회색으로 표시하지 않고 WinForms에서 콤보 박스를 비활성화 할 수 있습니까?

+0

변경 사항을 거부하려면 해당 메소드를 처리하고 그렇게하십시오. –

+2

그러면 정상적으로 보이지만 대화 상자를 사용할 수없는 콤보 상자를 원하십니까? 이 사용 불능 상태에 있음을 사용자에게 어떻게 나타내 보시겠습니까? –

+3

이것은 정말로 나쁜 생각입니다. 콤보 상자를 회색으로 표시하는 것은 사용자가 비활성화되어 있고 수정할 수 없다는 것을 사용자가 알 수있는 방법입니다. * 보이지만 활성화 된 콤보 상자는 사용자의 편집 시도를 무시하고 혼란스럽지 않습니다. 그 인터페이스를 부러 뜨릴 것입니다 **. –

답변

6

당신의 comobobox 당신이 찾고있는 트릭을 할 것입니다, 콤보가 활성화되어 있지만 아무도 만약 어떤 이유로 당신을 위해

 comboBox1.DropDownHeight = 1; 
     comboBox1.KeyDown += (s, e) => e.Handled = true; 
     comboBox1.KeyPress += (s, e) => e.Handled = true; 
     comboBox1.KeyUp += (s, e) => e.Handled = true; 

: = 장애인 그래서 외관 = 사용, 행동을 변경하거나 아무 것도 입력 할 수 있습니다 람다를 사용할 수 없으면 다음 핸들러를 연결할 수 있습니다. 오른쪽 클릭 -> 붙여 넣기는 DropDownStyle = DropDown 인 경우 추가로 처리해야합니다.

//void comboBox1_KeyUp(object sender, KeyEventArgs e) 
    //{ 
    // e.Handled = true; 
    //} 

    //void comboBox1_KeyPress(object sender, KeyPressEventArgs e) 
    //{ 
    // e.Handled = true; 
    //} 

    //void comboBox1_KeyDown(object sender, KeyEventArgs e) 
    //{ 
    // e.Handled = true; 
    //} 
+0

마우스를 사용하면 어떻게됩니까? –

+0

아무것도 아니며 마우스로 변경할 수있는 것도 없습니다. –

+0

어떻게 다시 활성화합니까? – MBU

0

그런 다음 자신의 처리기를 변수로 저장하고 그 뒤에 간단히 - = 뒤에 입력하십시오.

예 :

var keyDown = (s, e) => e.Handled = true; 
var keyPress = (s, e) => e.Handled = true; 
var keyUp = (s, e) => e.Handled = true; 

그런 다음에 대체 자신과 그런 다음

comboBox1.KeyDown += keyDown; 
comboBox1.KeyPress += keyPress; 
comboBox1.KeyUp += keyUp; 

제거 할 때

comboBox1.KeyDown -= keyDown; 
comboBox1.KeyPress -= keyPress; 
comboBox1.KeyUp -= keyUp; 
+0

var를 사용하는 것만 큼 간단하지는 않습니다. Sanjeevakumar의 메소드와 - = 그 메소드를 사용하십시오. –

+0

또는 someBoolVar가 활성화/비활성화 상태 인 경우 'e.Handled = someBoolVar'를 사용하십시오. –

+0

DropDownHeight의 높이를 어떻게 재설정합니까? 처음에 높이를 저장해야합니까? 다시 활성화하려면 재설정할까요? – MBU

0

을의 GotFocus 투수에서 (그것이라고 무엇이든) 초점을 다른 것으로 설정하십시오.

0

아니, 충분하지 않습니다. 사용하지 않도록 설정하고 이 정확히처럼 보이게하여 사용자가 완전히 바보가되도록합니다. 새 클래스를 추가하고이 코드를 붙여 넣습니다.

using System; 
using System.Drawing; 
using System.Windows.Forms; 

class FakeComboBox : ComboBox { 
    private PictureBox fake; 
    public new bool Enabled { 
     get { return base.Enabled; } 
     set { if (!this.DesignMode) displayFake(value); 
       base.Enabled = value; 
     } 
    } 
    private void displayFake(bool enabled) { 
     if (!enabled) { 
      fake = new PictureBox(); 
      fake.Location = this.Location; 
      fake.Size = this.Size; 
      var bmp = new Bitmap(fake.Size.Width, fake.Size.Height); 
      this.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height)); 
      fake.Image = bmp; 
      this.Parent.Controls.Add(fake); 
      fake.BringToFront(); 
      fake.Click += delegate { Console.Beep(); }; 
     } 
     else { 
      this.Parent.Controls.Remove(fake); 
      fake.Dispose(); 
      fake = null; 
     } 
    } 
} 

다시 활성화하면 Win7에서 매우 작은 '발광'이 발생합니다. 매우 흥미 롭습니다.

+0

하하, 환상적입니다. 불합리한 점은 DropDownHeight를 0으로 설정하는 것보다 훨씬 좋은 해결책입니다. –

+0

Beep()을 잊어 버렸습니다. –

+0

이 컨트롤을 활성화하면 다시 활성화를 설정하십시오. 이 코드는 null 인'fake'를 처리하려고합니다. 예외를 던집니다. 둘째로 여전히 회색으로 보입니다. 활성화 된 콤보처럼 보일 경우 모든 테마 변경 사항을 처리해야합니다. –

관련 문제