2012-10-11 5 views
1

텍스트 상자와 목록 상자 중 하나에 포커스가있을 때만 목록 상자가 표시되도록하려는 목록 상자가있는 설정이 있습니다. 먼저 목록 상자가 보이지 않게됩니다. 그런 다음 텍스트 상자에 포커스가 있으면 목록 상자가 표시되어야합니다. 목록 상자가 다시 보이지 않게되면 초점을 잃어 버리지도받지 못하는 경우에만. 그래서 내가 달성하고자하는 것은 다음은 항상 사실이다 :어떤 컨트롤이 활성화되어 있는지 감지

listBox.Visible = textBox.Focused || listBox.Focused

내 솔루션에서

텍스트 상자 및/또는 목록 상자는 표준 타입의 전문화 될 수 있습니다 (이 솔루션을 단순화 경우) .

저는 LostFocus와 GotFocus 이벤트를 모두 제어하고 거기에서 목록 상자의 가시성을 설정하려고했습니다. 그러나 GotFocus 이벤트는 텍스트 상자가 포커스를 잃었을 때 보이지 않게 설정하므로 목록 상자에서 호출되지 않습니다.

누구든지 이것을 달성하는 방법에 대한 제안이 있습니까? 내 백업 계획 (내가 싫어하는)은 하나가 초점을 잃었을 때 타이머를 시작하고 다른 하나가 초점을 받으면 중지하는 것입니다. 그래서 그것을 달성하는 "청소기"방법은 크게 감사하겠습니다;)

편집 :이 항목은 .NET WinForms 사용자 정의 컨트롤로 사용하기 위해 개발 중입니다.

편집 2 :

내가 충분히 자신을 아주 잘 설명하지 않은 것으로 보인다. 그래서 내가 더 명확하게 달성하고 싶은 것을 설명하려고 노력할 것입니다.

새로운 유형의 TextBox (몇 년 전에 구축 한 기존 유형의 TextBox를 상속)는 무엇입니까? TextBox는 현재 개체의 IList를 구현하는 하위 형식을 포함하는 제네릭 컬렉션으로 작동하고 있습니다. TextBox는 일련의 조건을 기반으로 컬렉션의 요소 하위 집합을 표시하는 ListBox를 정의합니다. TextBox는 부모 컨트롤에 추가되므로 ListBox도 부모 컨트롤에 추가됩니다. 따라서이 둘은 collection-in-a-collection 종류의 설정으로 작동합니다. 입력을 시작할 때 브라우저가 제안 할 때와 같은 정렬.

두 컨트롤 모두를 포함하는 UserControl 대신이 설정을 사용합니다. 두 컨트롤 중 하나 인 usercontrol이 두 컨트롤의 크기이거나 (크기가 TextBox와 일치하는 경우) ListBox가 보이지 않기 때문입니다.

나는이 컨트롤이 추가 된 양식의 모든 컨트롤에서 GotFocus 또는 Enter 이벤트를 처리하도록 선택할 수 있음을 알고 있습니다. 이것은 내가 생각해 보았던 아주 직관적 인 접근법이지만, 폼의 다른 모든 컨트롤을 듣지 않는 컨트롤을 작성하는 것을 선호합니다.

이 내용이 명확 해지기를 바랍니다.

답변

0

Enter 이벤트 처리기를 다른 모든 컨트롤에 추가하면됩니다.

private void OtherControls_Enter(object sender, EventArgs e) 
{ 
    listBox.Visible = false; 
} 

편집 :
예 윈폼에 대한하지만 aswell WPF와 함께 작동합니다.

사용자 지정 컨트롤 만 TextBoxListBox 다음 당신은 ListBox 볼을 설정 TextBox에 이벤트를 추가 포함되어있는 경우 : 다른 컨트롤이 있다면 당신은 그들에게 OtherControls_Enter 이벤트 처리기를 추가

private void textBox1_Enter(object sender, EventArgs e) 
{ 
    listBox1.Visible = true; 
} 

. 이 같은 추가 사용자 지정 컨트롤의 Leave 이벤트에

:

private void userControl11_Leave(object sender, EventArgs e) 
{ 
    userControl11.Controls["listbox1"].Visible = false; 
} 

편집 2 :
더 나은 사용자 정의 컨트롤 내에서 ListBox를 노출하는 것입니다

public ListBox TheListBox { get { return listBox1; } } 

다음 :

private void userControl11_Leave(object sender, EventArgs e) 
{ 
    userControl11.TheListBox.Visible = false; 
} 
+0

이 방법 내 유일한 문제는 내가 이렇게 나는 것 (내가 아마 언급한다) 사용자 지정 컨트롤을 개발하고있어 것입니다 이 사용자 지정 컨트롤이 해당 문제의 양식이나 패널에 추가되므로 모든 컨트롤에 처리기를 추가해야합니다. 폼에 컨트롤을 추가/제거 할 때를 포함하여 모든 핸들러를 추가/제거하는 프로세스는 신속하게 이벤트를 복잡하게 만듭니다. 또한 다른 종류의 핸들러가 컨트롤에 추가된다는 것을 알 수 없습니다. – DeadDog

+0

또한 "OnFocus"이벤트가 없습니다. "GotFocus"이벤트를 의미하고 이벤트 처리기의 이름이 적절하다고 가정했습니다. – DeadDog

+0

어떤 기술을 사용하고 있습니까? WPF? ASP.NET? WinForms? 사용자 지정 컨트롤에는 무엇이 들어 있습니까? TextBox 및 ListBox 만? –

0

모든 Control_Enter 이벤트를 중앙 집중식으로 구현하고 보낸 사람 개체가 텍스트 상자 또는 목록 상자인지 확인한 다음 목록 상자가 보이지 않는 다른 항목에 표시되는지 확인하십시오. 이

this.button1.Enter += new System.EventHandler(this.Control_Enter); 
    this.textBox1.Enter += new System.EventHandler(this.Control_Enter); 
    this.listBox1.Enter += new System.EventHandler(this.Control_Enter); 

private void Control_Enter(object sender, EventArgs e) 
    { 
     Control obj = (Control)sender; 
     if (obj.Name == "textBox1" || obj.Name == "listBox1") 
     { 
      listBox1.Visible = true; 
     } 
     else 
     { 
      listBox1.Visible = false; 
     } 
    } 

망가처럼

제어 탭 인덱스를 지정하는 것을 잊지

관련 문제