2008-09-01 3 views
6

저는 사용자가 양식에 데이터를 입력하는 Windows 양식 응용 프로그램 (C#)에서 작업하고 있습니다. 양식의 데이터를 편집하는 동안 사용자는 양식의 단추 중 하나를 클릭하여 특정 조치를 수행 할 수 있습니다. 기본적으로 포커스는 클릭 된 버튼으로 이동하므로 사용자가 폼에서 데이터 수정을 계속하기 위해 편집하려는 컨트롤로 다시 클릭해야합니다. 내가 할 수 있어야 할 일은 버튼 클릭 이벤트가 처리 된 후 마지막으로 편집 된 컨트롤로 포커스를 되돌려 보내는 것입니다. 여기에 내가 무슨 말인지 설명하는 샘플 스크린 샷입니다 :어떻게 Winform 응용 프로그램에서 단추를 클릭 한 후 마지막으로 사용한 컨트롤에 포커스를 반환합니까?

Sample App Screen Shot

사용자는 TextBox1에, TextBox2를, textbox3 등의 데이터를 입력하고 버튼을 클릭 할 수 있습니다. 단추를 클릭하기 전에 가장 최근에 포커스가있는 컨트롤로 포커스를 되돌리려면 단추가 필요합니다.

누구든지이 기능을 구현하는 데 더 좋은 방법이 있는지 궁금합니다. 여기에 제가 지금하고있는 일이 있습니다 :

public partial class Form1 : Form 
    { 
     Control _lastEnteredControl; 

     private void textBox_Enter(object sender, EventArgs e) 
     { 
      _lastEnteredControl = (Control)sender; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      MessageBox.Show("Do something here"); 
      _lastEnteredControl.Focus(); 
     } 


    } 

그래서 기본적으로 여기에는 마지막으로 입력 한 컨트롤을 가리키는 클래스 변수가 있습니다. 양식의 각 텍스트 상자는 설정되어 있으므로 컨트롤이 포커스를받을 때 textBox_Enter 메서드가 시작됩니다. 그런 다음 단추를 클릭하면 단추를 클릭하기 전에 포커스가있는 컨트롤로 포커스가 반환됩니다. 아무도 이것에 대한 더 우아한 솔루션을 가지고 있습니까?

답변

16

'단순함'에 대해 조금만 시도해보십시오.

public Form1() 
    { 
     InitializeComponent(); 

     foreach (Control ctrl in Controls) 
     { 
      if (ctrl is TextBox) 
      { 
       ctrl.Enter += delegate(object sender, EventArgs e) 
           { 
            _lastEnteredControl = (Control)sender; 
           }; 
      } 
     } 
    } 

그러면 수동으로 각 텍스트 상자를 꾸미는 것에 대해 걱정할 필요가 없습니다 (또는 하나도 잊어 버림).

+0

재귀가 필요합니다. – SLaks

0

구현이 충분 해 보입니다. 내가 알고 싶은 것은 왜 이것을 처음부터하고 싶은지입니다. 포커스가 첫 번째 항목으로 되돌아가는 것이 더 바람직하지 않습니까? 마지막 텍스트 상자의 데이터가 너무 가단해서 버튼을 클릭하면 "기억"됩니까? 또는 버튼이 특정 텍스트 상자 데이터에 대해 수행하는 일종의 작업이 있습니까?이 경우 포커스가 후속 컨트롤로 이동해서는 안됩니다.

내가 처음에 이것을하고 싶은 이유를 찾는 데 관심이 있습니다.

1

나는 당신이하고있는 것이 괜찮다고 생각한다. 내가 그것을 개선하기 위해 생각할 수있는 유일한 방법은 액세스 할 때 각 컨트롤을 스택에 저장하는 것입니다. 그러면 액세스 된 전체 시간대가 표시됩니다.

1

당신의 접근 방식이 좋아 보인다. 추가하는 모든 컨트롤에 이벤트 처리기를 추가하지 않아도되도록하려면 재귀 루틴을 만들어 양식의 모든 컨트롤에 GotFocus 수신기를 추가 할 수 있습니다. 이는 양식의 모든 유형의 컨트롤에서 작동하지만 필요에 맞게 조정할 수 있습니다.

private void Form_OnLoad(object obj, EventArgs e) 
{ 
    AddGotFocusListener(this); 
} 

private void AddGotFocusListener(Control ctrl) 
{ 
    foreach(Control c in ctrl.Controls) 
    { 
     c.GotFocus += new EventHandler(Control_GotFocus); 
     if(c.Controls.Count > 0) 
     { 
      AddGotFocusListener(c); 
     } 
    } 
} 

private void Control_GotFocus(object obj, EventArgs e) 
{ 
    // Set focused control here 
} 
0

그래, 나는 조금 이상한 것을 인정한다. 사용자가이 응용 프로그램에 입력하게 될 정보 중 몇 가지는 서로 다른 저장소에있는 오래된 문서를 검색 할 때 사용됩니다. 버튼을 사용하면 이러한 오래된 문서를 쉽게 찾을 수 있습니다. 양식에 입력 할 정보가 많은 문서를 가져올 때 사용자가 양식에있는 위치를 예측하는 것은 어렵습니다. 이러한 펑키 한 상황에도 불구하고 UI 흐름을 원활하게 만드는 것이 목적입니다.

2

다음을 수행 할 수 있습니다.

단추를 레이블로 변경하여 단추 모양으로 변경하십시오. 라벨에 초점을 맞출 수 없으며 모든 추가 코딩을 수행 할 필요가 없습니다.

0

TextBox에서 상속받은 CustomTextBox라는 클래스를 만듭니다. stack이라는 정적 변수가 있습니다. 텍스트 상자가 포커스를 잃을 때 스택 위로 밀어 넣습니다. 마지막 포커스 된 컨트롤을 찾으려면 스택의 첫 번째 항목을 팝합니다. 정적 스택 변수를 지우십시오.

관련 문제