WinForms의 TextBox에서 포커스를 제거하는 방법은 무엇입니까?


110

여러 TextBox에서 포커스를 제거해야합니다. 나는 사용해 보았다 :

textBox1.Focused = false;

그것의 ReadOnly속성 값입니다 true.

그런 다음 모든 TextBox에서 제거하기 위해 양식에 포커스를 설정하려고 시도했지만 작동하지 않습니다.

this.Focus();

false텍스트 상자가 선택되면 함수가 반환 됩니다.

그렇다면 TextBox에서 포커스를 어떻게 제거합니까?

답변:


113

포커스를 이동하려면 다른 포커스 가능한 컨트롤이 필요합니다.

포커스를 레이블로 설정할 수 있습니다. 다음에 [Tab] 키를 사용할 위치를 고려할 수 있습니다.

또한 양식으로 설정할 수 없습니다. Form 및 Panel과 같은 컨테이너 컨트롤은 Focus on을 첫 번째 자식 컨트롤로 전달합니다. 이동하려는 TextBox가 될 수 있습니다.


감사; 방금 레이블에 초점을 맞추려고했는데 이제 텍스트 상자가 초점이 맞지 않습니다. 어떤 이유로 양식에 집중할 수없는 것 같습니다.
Callum Rogers

7
컨테이너 컨트롤 (양식, 패널)은 포커스를 첫 번째 자식 컨트롤로 전달합니다.
Henk Holterman

좋은 제안입니다. 이것은 내 문제를 해결했습니다. 나는 양식 자체에 대해 KeyPress를 사용하고 있으며 여러 버튼 등이 있습니다. 문제는 앱이 카드 리더에서 입력을받는 것이므로 초점이 양식 자체에서 벗어나면 모든 지옥이 풀립니다. 버튼 클릭 후 레이블에 집중하면 문제가 해결되었습니다. 정말 고마워!
joelc 2013

62

레이블에 집중하는 것이 저에게 효과가 없었 label1.Focus()습니다. 양식을로드 할 때 텍스트 상자에 여전히 포커스가 있지만 Velociraptors 응답을 시도 하면 Form의 Active 컨트롤을 다음과 같이 레이블로 설정하여 저에게 효과적 이었습니다.

private void Form1_Load(object sender, EventArgs e)  
{ 
    this.ActiveControl = label1;       
}

7
나는 당신에게 백만 개의 화살을 줄 수 있으면 좋겠다. 나는 사람들이 제안한 다른 모든 것을 시도했지만 이것이 유일한 방법입니다. 어떤 이유로, 텍스트 상자는 항상 모든 것을에서 초점 ... 훔친
eladyanai

3
이는 패널과 같은 컨테이너 컨트롤에도 적용됩니다. 초점을 완전히 제거하고 싶었습니다.this.ActiveControl = panelOnMyForm;
Tim Schmelter 2013-04-09

52

다음 코드를 추가 할 수 있습니다.

this.ActiveControl = null;  //this = form

7
이것이 최선의 답이라고 생각합니다. MSDN을 읽으면 "Focus"와 같은 다른 많은 방법이 컨트롤 디자이너를위한 저수준 방법으로 나열됩니다. 다른 모든 항목을 "선택하지 않음"으로 설정하려면이 방법이 가장 쉬운 방법 인 것 같습니다. 음, 하나의 작은 선일뿐입니다.
Rostov

1
이것은 Microsoft가 처음에이 속성을 추가 한 이유의 절반 일 수 있습니다.
Panzercrisis

이것은 가장 우아한 솔루션처럼 보이며 제 경우에는 완벽하게 작동했습니다.
NetWave

이 답변이 제대로 작동하기를 원하지만 제 경우에는 Leave 이벤트를 트리거하는 동안 Validating / Validated 이벤트를 트리거하지 않았기 때문에 작동하지 않았습니다.
Rhys Jones

32

텍스트 상자를 비활성화하고 활성화하십시오.


5
그 동안 탭 목록에서 다음 컨트롤을 자동으로 선택하므로 매우 매끄럽게 작동합니다.
Nick

3
MVVM을 사용하여 Silverlight에서 개발 중이며 TextBox를 대상으로하는 동작을 사용하여 구현했습니다. Disable / Enable 솔루션에 초점을 맞추기 위해 편리한 다른 UIElement가 없었기 때문에 놀라웠습니다. 감사!
Albert Oldfield

어떻게 비활성화 할 수 있습니까?
miguelmpn

1
@miguelmpn textBox1.Enabled = false;은 텍스트 상자를 비활성화합니다. 로 설정 true하면 다시 활성화됩니다.
Raktim Biswas

24

양식 activecontrol속성을 다음 null과 같이 설정할 수도 있습니다.

ActiveControl = null;

7
나는 사람들이 모두 다운이가는 길을 스크롤 그냥 답변으로 표시된 해결 방법 사용하지 않는 희망
makoshichi

오늘도 여전히 최고의 답변입니다. 여기 친구, 내 찬성 투표를 받아보세요.
xoxel

8

Focus입력 포커스를 설정하므로 양식이 입력을 받아들이지 않으므로 양식으로 설정하면 작동하지 않습니다. 양식의 ActiveControl속성을 다른 컨트롤로 설정해보십시오 . Select특정 컨트롤 SelectNextControl을 선택 하거나 탭 순서에서 다음 컨트롤 을 선택하는 데 사용할 수도 있습니다 .


1
여기서 다른 모든 것을 시도 Select()하고 나를 위해 일했습니다.
Derek W

8

이거 한번 해봐:

먼저 탭 순서를 설정합니다.

그런 다음 양식로드 이벤트에서 프로그래밍 방식으로 응용 프로그램에 탭 키 누름을 보낼 수 있습니다. 따라서 해당 응용 프로그램은 탭 순서에서 첫 번째 제어에 초점을 맞 춥니 다.

양식로드에서도이 줄을 작성하십시오.

SendKeys.Send("{TAB}");

이것은 나를 위해 일했습니다.


4

이 게시물은 나를 이렇게 유도합니다.

ActiveControl = null;

이렇게하면 다른 컨트롤이 제대로 작동하지 않고 최상위 수준에서 모든 키보드 입력을 캡처 할 수 있습니다.


3

좋은 대안을 찾았습니다! 다른 것에 초점을 맞추지 않고 가장 잘 작동합니다.

시도해보십시오.

private void richTextBox_KeyDown(object sender, KeyEventArgs e)
{    
    e.SuppressKeyPress = true;
}

3

내 사용자 정의 컨트롤에서 이것을 만들었습니다. onFocus ()

this.Parent.Focus();

따라서 texbox에 초점을 맞춘 경우-즉시 텍스트 상자 부모 (양식 또는 패널 ...)에 초점을 맞 춥니 다. 사용자 정의 컨트롤에서이를 만들려면 좋은 옵션입니다.


2

다른 요소에 초점을 맞출 필요가없는 것 같습니다. Windows Phone 7 응용 프로그램에서 Focus 메서드를 사용하여 텍스트 상자의 Focus 설정을 해제했습니다.

다음 명령을 내리면 포커스가 아무것도 설정되지 않습니다.

void SearchBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        Focus();
    }
}

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx

그것은 나를 위해 일했지만 왜 그것이 당신에게 효과가 없었는지 모르겠습니다 : /


2

간단한 해결책은 포커스를 없애고 자신 만의 클래스를 만드는 것입니다.

public class ViewOnlyTextBox : System.Windows.Forms.TextBox {
    // constants for the message sending
    const int WM_SETFOCUS = 0x0007;
    const int WM_KILLFOCUS = 0x0008;

    protected override void WndProc(ref Message m) {
        if(m.Msg == WM_SETFOCUS) m.Msg = WM_KILLFOCUS;

        base.WndProc (ref m);
    }
}

내가 찾던 바로 그 종류의 솔루션. 감사!
LeftyCoder

1
    //using System;
    //using System.Collections.Generic;
    //using System.Linq;

    private void Form1_Load(object sender, EventArgs e)
    {
        FocusOnOtherControl(Controls.Cast<Control>(), button1);
    }

    private void FocusOnOtherControl<T>(IEnumerable<T> controls, Control focusOnMe) where T : Control
    {
        foreach (var control in controls)
        {
            if (control.GetType().Equals(typeof(TextBox)))
            {
                control.TabStop = false;
                control.LostFocus += new EventHandler((object sender, EventArgs e) =>
                {                     
                    focusOnMe.Focus();
                });
            }
        }
    }

0

이 문제를 해결하는 방법은 모든 winform 컨트롤을 배치하는 것입니다. 모든 레이블과 선택하지 않는 winform 컨트롤을 탭 순서 0으로 만든 다음 첫 번째 컨트롤을 탭 순서 2로 만든 다음 각 선택 가능한 컨트롤의 순서를 1 씩 증가 시키므로 3, 4, 5 등 ...

이렇게하면 내 Winforms가 시작될 때 첫 번째 TextBox에 포커스가 없습니다!


0

두 가지 방법으로 할 수 있습니다

  • 원하는 텍스트 상자의 "TabStop"속성을 false로 설정하면 텍스트 필드가 하나 있어도 초점이 맞지 않습니다.
  • 두 개의 텍스트 상자 끌기

    1. textbox1 인 foucus를 원하지 않는 것을 표시하십시오.
    2. 두 번째 항목을 보이지 않게 만들고 해당 텍스트 필드의 속성으로 이동하여

tabindex 값을 textbox2의 0으로 설정

  1. 이제 textbox1의 tabindex를 1로 선택하면 textbox1에 초점을 맞추지 않습니다.

0

텍스트 상자의 내용 전체에 파란색 선택이없는 광학 효과 만 원하는 경우 텍스트를 선택하지 마십시오.

textBox_Log.SelectionStart = 0;
textBox_Log.SelectionLength = 0;
textBox_Log.Select();

그 후로 콘텐츠를 추가하면 .Text += "..."파란색 선택이 표시되지 않습니다.


0

설정 시도하십시오 TabStopFalse초점이되지 뷰 컨트롤.

예 :

txtEmpID.TabStop = false;

-1

Form 또는 UserControl의 생성자에서 TextBox 쓰기

SetStyle(ControlStyles.Selectable, false);

InitializeComponent (); 이후 출처 : https://stackoverflow.com/a/4811938/5750078

예:

public partial class Main : UserControl
{

    public Main()
    {
        InitializeComponent();
        SetStyle(ControlStyles.Selectable, false);
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.