WinForms TextBox를 브라우저의 주소 표시 줄처럼 동작하게 만들기


154

C # WinForms 텍스트 상자가 포커스를 받으면 브라우저의 주소 표시 줄처럼 작동하기를 원합니다.

무슨 뜻인지 보려면 웹 브라우저의 주소 표시 줄을 클릭하십시오. 다음과 같은 동작이 나타납니다.

  1. 텍스트 상자를 클릭하면 텍스트 상자의 초점이 맞지 않은 경우 모든 텍스트를 선택해야합니다.
  2. 텍스트 상자에서 마우스를 아래로 끌어서 마우스로 강조 표시 한 텍스트 만 선택해야합니다.
  3. 텍스트 상자에 이미 초점이 맞춰져 있으면 클릭해도 모든 텍스트가 선택되지는 않습니다.
  4. 프로그래밍 방식으로 또는 키보드 탭을 통해 텍스트 상자에 초점을 맞추면 모든 텍스트를 선택해야합니다.

WinForms에서 정확히 이것을하고 싶습니다.

가장 빠른 총 경고 : 응답하기 전에 다음을 읽으십시오! 고마워 :-)

.Enter 또는 .GotFocus 이벤트 중에 .SelectAll ()을 호출 하면 사용자가 텍스트 상자를 클릭 한 경우 캐럿이 클릭 한 위치에 캐럿이 배치되어 모든 텍스트가 선택 취소되므로 작동하지 않습니다 .

사용자가 마우스로 텍스트를 선택할 수 없기 때문에 .Click 이벤트 중에 .SelectAll ()을 호출하면 작동 하지 않습니다. .SelectAll () 호출은 사용자의 텍스트 선택을 덮어 씁니다.

포커스 / 엔터 이벤트 입력시 BeginInvoke ((Action) textbox.SelectAll)을 호출 하면 위의 규칙 # 2가 위반되어 작동하지 않습니다 . 포커스에서 사용자의 선택을 계속 무시합니다.


3
이것이 "RichTextBox"임을 명확히하십시오.
Nescio

텍스트 상자 또는 서식있는 텍스트 상자 인 Nescio가 수행합니다. 텍스트 상자에서도 솔루션을 시도했습니다.
유다 가브리엘 히 망고

이것은 추상화 누출입니다. WM_MOUSEACTIVATE-ing이 아닌 경우 WM_MOUSEACTIVATE 및 SelectAll을 WM_SETFOCUS에 표시하는 가장 좋은 방법입니다.
wqw

답변:


109

우선, 답변 주셔서 감사합니다! 총 9 개의 답변입니다. 감사합니다.

나쁜 소식 : 모든 답변에 약간의 문제가 있거나 제대로 작동하지 않았습니다 (또는 전혀). 각 게시물에 의견을 추가했습니다.

좋은 소식 : 나는 그것을 작동시킬 방법을 찾았습니다. 이 솔루션은 매우 간단하며 모든 시나리오에서 작동합니다 (마우스 다운, 텍스트 선택, 포커스 탭 등).

bool alreadyFocused;

...

textBox1.GotFocus += textBox1_GotFocus;
textBox1.MouseUp += textBox1_MouseUp;
textBox1.Leave += textBox1_Leave;

...

void textBox1_Leave(object sender, EventArgs e)
{
    alreadyFocused = false;
}


void textBox1_GotFocus(object sender, EventArgs e)
{
    // Select all text only if the mouse isn't down.
    // This makes tabbing to the textbox give focus.
    if (MouseButtons == MouseButtons.None)
    {
        this.textBox1.SelectAll();
        alreadyFocused = true;
    }
}

void textBox1_MouseUp(object sender, MouseEventArgs e)
{
    // Web browsers like Google Chrome select the text on mouse up.
    // They only do it if the textbox isn't already focused,
    // and if the user hasn't selected all text.
    if (!alreadyFocused && this.textBox1.SelectionLength == 0)
    {
        alreadyFocused = true;
        this.textBox1.SelectAll();
    }
}

내가 알 수있는 한, 이것은 텍스트 상자가 웹 브라우저의 주소 표시 줄과 똑같이 동작하게합니다.

잘만되면 이것은이 믿을 수 없을 정도로 간단한 문제를 해결하려는 다음 사람에게 도움이되기를 바랍니다.

올바른 길로 인도하는 데 도움이 된 모든 답변에 대해 다시 한 번 감사드립니다.


프로그래밍 방식으로 포커스가 TextBox로 설정된 경우는 어떻습니까? 여기에 논의 된 바와 같이 그 문제가 있습니다 : stackoverflow.com/questions/24790704/… 나는 유행 후에 그것을 해결할 수 있었지만 내 "수정"이 다소 어색해 보이는 것처럼 여전히 그것에 대해 긴장하고 있습니다.
B. Clay Shannon

".Enter 또는 .GotFocus 이벤트 중에 .SelectAll ()을 호출하면 사용자가 텍스트 상자를 클릭하면 캐럿이 클릭 한 위치에 배치되어 모든 텍스트를 선택 해제하므로 캐럿이 배치되므로 작동하지 않습니다." GotFocus 이벤트에는 SelectAll이 있으며 대부분 작동합니다. 사실, 사용자가 클릭 한 곳에 커서를 놓는 것이 "좋은 것"이라고 생각합니다. 포커스가 프로그래밍 방식으로 TextBox로 설정되면 항상 선택하기를 원합니다.
B. Clay Shannon

그리고 또 왔어요! :)
dotNET

3
alreadyFocused = true;if 문에서 MouseUp을 이동해야 합니다. 텍스트의 일부를 즉시 선택하면 다음에 클릭 할 때 전체 텍스트가 다시 선택됩니다.
Robert S.

아래에 하나의 라이너 답변이 있습니다. --- BeginInvoke ((Action) MyTextBox.SelectAll); --- 가치가 있습니다. 필요한 모든 일을하는 것 같습니다
Grey General

78

더 간단한 해결책을 찾았습니다. Control.BeginInvokeEnter 및 Click 이벤트가 발생한 후에 발생하도록 SelectAll을 비동기 적으로 사용하여 시작합니다.

C #에서 :

private void MyTextBox_Enter(object sender, EventArgs e)
{
    // Kick off SelectAll asyncronously so that it occurs after Click
    BeginInvoke((Action)delegate
    {
        MyTextBox.SelectAll();
    });
}

VB.NET에서 ( Krishanu Dey 덕분에 )

Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter 
    BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) 
End Sub

5
내가 찾은 가장 현명한 답변 .. 대단히 감사합니다 .. VB.net에 대한 해결책은 다음과 같습니다. Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) End Sub
Krishanu Dey

클래스 많은 '최고의 솔루션, 웹 브라우저 URL 표시 줄, 많은 클래스 엔드 클래스
ar.dll

7
.Net 4.0에서는 다음을 수행 할 수 있습니다. BeginInvoke ((Action) MyTextBox.SelectAll);
JoelFan

2
불행히도 BeginInvoke는 나를 위해 작동하지 않습니다 (확실히 먼지가 많은 Dot net 버전으로 인해 의심의 여지가 없습니다). "제어"앞에 그것에 도움이되지 않으며 TextBox 자체의 이름 앞에 붙지 않습니다. 혼자서 창백한 배회
B. Clay Shannon

2
이 솔루션은 질문에 설명 된대로 정확하게 작동하지 않습니다. 특히 Mouse down and drag in the textbox should select only the text I've highlighted with the mouse.원하는대로 작동하지 않습니다. 하지만 여전히 최단 가장 우아한 해결책 :
마커스 Mangelsdorf

30

귀하의 솔루션은 좋지만 특정 사례에서 실패합니다. 그냥 클릭하는 대신 텍스트 범위를 선택하여 TextBox 포커스를 설정하면 이미 초점 플래그가 true로 설정되지 않으므로 TextBox를 두 번 클릭하면 모든 텍스트가 선택됩니다.

여기 내 솔루션 버전이 있습니다. 또한 TextBox를 상속하는 클래스에 코드를 넣었으므로 논리가 숨겨져 있습니다.

public class MyTextBox : System.Windows.Forms.TextBox
{
    private bool _focused;

    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        if (MouseButtons == MouseButtons.None)
        {
            SelectAll();
            _focused = true;
        }
    }

    protected override void OnLeave(EventArgs e)
    {
        base.OnLeave(e);
        _focused = false;
    }

    protected override void OnMouseUp(MouseEventArgs mevent)
    {
        base.OnMouseUp(mevent);
        if (!_focused)
        {
            if (SelectionLength == 0)
                SelectAll();
            _focused = true;
        }
    }
}

2
맞춤 텍스트 상자 제안 및 완벽하게 작동하는 솔루션 +1!
연료 공급

훌륭한 솔루션. 코드를 내 솔루션에 바로 복사하고 네임 스페이스를 변경하여 무고한 사람들을 보호하고 완벽하게 작동했습니다. 감사!
kenswdev

8

약간 엉뚱하지만 클릭 이벤트에서는을 사용하십시오 SendKeys.Send( "{HOME}+{END}" );.


우프 타! 그것은 약간의 해커입니다! :-) 제안 해 주셔서 감사합니다. 더 좋은 아이디어가 있습니까?
유다 가브리엘 히 망고

실제로 해킹하지만 이것이 전혀 나쁘지는 않습니다
Terry

3
많은 안티 바이러스 프로그램이 SEND KEYS를 가로 채서 차단하는 것을 고려하십시오. 좋은 해결책이 아닙니다.
유다 가브리엘 히 망고

4

텍스트 상자의 이벤트를 클릭 하시겠습니까? 또는 MouseCaptureChanged 이벤트조차도 나를 위해 작동합니다. - 확인. 작동하지 않습니다.

따라서 두 가지 작업을 수행해야합니다.

private bool f = false;

private void textBox_MouseClick(object sender, MouseEventArgs e)
{ 
  if (this.f) { this.textBox.SelectAll(); }
  this.f = false;
}

private void textBox_Enter(object sender, EventArgs e)
{
  this.f = true;
  this.textBox.SelectAll();
}
private void textBox_MouseMove(object sender, MouseEventArgs e) // idea from the other answer
{
  this.f = false; 
}

텍스트 상자를 통해 탭으로도 사용할 수 있습니다-경우에 따라 Enter에서 SelectAll ()을 호출하십시오 ...


Ok Jakub, 부분적으로 작동합니다. 텍스트 상자를 탭하면 초점을 맞춰야합니다. 귀하의 솔루션과 함께 작동합니까? (어떻게 보여줄 수 있다면 답을 정답으로 표시하겠습니다.)
Judah Gabriel Himango

Jakub, 이제 코드를 게시 했으므로 때로는 작동 하는 것 같습니다 . 항상 그런 것은 아닙니다. 지금은 텍스트 상자를 클릭하고 모두 선택하지는 않습니다.
유다 가브리엘 히 망고

때로는 텍스트를 클릭하고 모두를 선택하지는 않습니다. 그것은 어떻게 든 .f 필드가 원래대로 설정되지 않았으며 SelectAll이 호출되지 않는 것과 같습니다. 이것을 보지 못했습니까?
유다 가브리엘 히 망고 2009 년

나는 mouseMouve 때문에 마우스를 움직일 때 (특히 넓은 글자로) 느리게 클릭 할 수 있다는 것을 알고 있습니다-> 플래그를 설정 해제하십시오. 당신은 MouseMove 이벤트의 코드를 제거 할 수 있습니다,하지만 당신은 얻을 것보다 - 클릭 한 후 제어 tabbgin 후 - reSelectAll을 - 첫번째 드래그 stirng의 일부가 선택할 수 없습니다
야쿱 Kotrla을

4

내가 사용하는 한 줄의 대답 ... 당신은 스스로 발로 차고있을 수 있습니다 ...

엔터 이벤트에서 :

txtFilter.BeginInvoke (새 MethodInvoker (txtFilter.SelectAll));


1
아뇨, 작동하지 않습니다. 모든 텍스트를 선택합니다. 그러나 사용자가 다른 문제 중에서 텍스트의 일부만 선택하지 못하게합니다.
유다 가브리엘 히 망고 2009

죄송합니다, 당신이 찾고있는 행동을 오해했을 것입니다. 클릭하면 처음부터 커서까지 클릭하여 길게 누르면 모두 선택됩니다. 내가 가진 것을 사용하고 SelectAll을 자신의 선택 논리로 바꿀 수 있다고 가정합니다. notifywire.com/demos/2009-04-14_1248.swf

잘 작동합니다! 첫 번째 클릭은 상자에 들어갑니다. 클릭하고 드래그하여 텍스트를 선택하십시오.
D_Bester

참고 : 웹 브라우저의 주소 표시 줄처럼 작동하지 않습니다. 웹 브라우저의 주소 표시 줄을 사용하면 텍스트 상자에 아직 초점이없는 경우에도 텍스트 상자에서 마우스를 아래로 끌어서 드래그 / 선택할 수 있습니다. 이 솔루션으로는 해결되지 않습니다. 괜찮다면 멋지지만이 질문의 요구 사항을 충족시키지 못합니다.
유다 가브리엘 히 망고

3
'Inside the Enter event
TextBox1.SelectAll();

좋아, 여기에 시도한 후에는 원하는 것입니다.

  • Enter 이벤트에서 Enter 이벤트에 있었음을 나타내는 플래그를 시작하십시오.
  • Click 이벤트에서 플래그를 설정 한 경우 .SelectAll ()을 호출하고 플래그를 재설정하십시오.
  • MouseMove 이벤트에서 입력 한 플래그를 false로 설정하면 텍스트 상자를 먼저 입력하지 않고도 강조 표시를 클릭 할 수 있습니다.

입력시 모든 텍스트를 선택했지만 나중에 텍스트의 일부를 강조 표시하거나 처음 클릭 할 때 강조 표시 할 수있었습니다.

요청에 의해:

    bool entered = false;
    private void textBox1_Enter(object sender, EventArgs e)
    {
        entered = true;
        textBox1.SelectAll();   //From Jakub's answer.
    }

    private void textBox1_Click(object sender, EventArgs e)
    {
        if (entered) textBox1.SelectAll();
        entered = false;
    }

    private void textBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (entered) entered = false;
    }

나를 위해 컨트롤을 누르면 모든 텍스트가 선택됩니다.


귀하의 솔루션은 Jakub의 솔루션과 유사합니다. 클릭하면 작동합니다. 텍스트 상자를 탭할 때 작동합니까? (예 : 브라우저의 주소 표시 줄을 탭하면 모든 텍스트도 선택됩니다.)
Judah Gabriel Himango

예, 탭 작업에도 효과적입니다. 테스트 응용 프로그램을 작성했으며 이것이 작동하는 방식입니다.
MagicKat

태빙에 효과가없는 것 같습니다. 탭 작업에 사용되는 코드를 알려주시겠습니까?
유다 가브리엘 히 망고

3

다음은 솔루션을 다음 단계로 끌어 올리는 도우미 함수입니다. 상속없이 재사용하십시오.

    public static void WireSelectAllOnFocus( TextBox aTextBox )
    {
        bool lActive = false;
        aTextBox.GotFocus += new EventHandler( ( sender, e ) =>
        {
            if ( System.Windows.Forms.Control.MouseButtons == MouseButtons.None )
            {
                aTextBox.SelectAll();
                lActive = true;
            }
        } );

        aTextBox.Leave += new EventHandler( (sender, e ) => {
            lActive = false;
        } );

        aTextBox.MouseUp += new MouseEventHandler( (sender, e ) => {
            if ( !lActive )
            {
                lActive = true;
                if ( aTextBox.SelectionLength == 0 ) aTextBox.SelectAll();
            }   
        });
    }

이것을 사용하려면 단순히 TextBox를 전달하는 함수를 호출하면 모든 지저분한 비트를 처리합니다. Form_Load 이벤트에서 모든 텍스트 상자를 연결하는 것이 좋습니다. 이 기능을 양식에 넣거나 원하는 경우 유틸리티 클래스에 더 많이 재사용 할 수 있습니다.


2

이것은 WPF / XAML TextBox에서 작동했습니다.

    private bool initialEntry = true;
    private void TextBox_SelectionChanged(object sender, RoutedEventArgs e)
    {
        if (initialEntry)
        {
            e.Handled = true;
            initialEntry = false;
            TextBox.SelectAll();
        }
    }
    private void TextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        TextBox.SelectAll();
        initialEntry = true;      
    }

2

이것은 nzhenry 의 인기있는 답변 과 비슷 하지만 하위 클래스를 만들 필요가 없다는 것을 알았습니다.

Private LastFocused As Control = Nothing

Private Sub TextBox1_Enter(sender As Object, e As System.EventArgs) Handles TextBox1.Enter, TextBox2.Enter, TextBox3.Enter
    If MouseButtons = Windows.Forms.MouseButtons.None Then LastFocused = sender
End Sub

Private Sub TextBox1_Leave(sender As Object, e As System.EventArgs) Handles TextBox1.Leave, TextBox2.Leave, TextBox3.Leave
    LastFocused = Nothing
End Sub

Private Sub TextBox1_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseUp, TextBox2.MouseUp, TextBox3.MouseUp
    With CType(sender, TextBox)
        If LastFocused IsNot sender AndAlso .SelectionLength = 0 Then .SelectAll()
    End With
    LastFocused = sender
End Sub

1

SelectAll은 나를 위해 일한 적이 없습니다.

작동합니다.

ActiveControl = textBox1;
textBox1->SelectionStart = 0;
textBox1->SelectionLength = textBox1->Text->Length;

텍스트 상자를 탭하면 포커스가 생기는 경우를 설명하지 않습니다. 또한이 스레드에서 논의 된 다른 문제 중 일부를 보여줍니다.
유다 가브리엘 히 망고

1

더 간단한 해결책을 찾았습니다.

textBox를 클릭 할 때 모든 텍스트가 선택되도록하려면 Click 핸들러가 Enter 핸들러를 호출해야합니다. 추가 변수가 필요 없습니다!

예:

private void textBox1_Click(object sender, EventArgs e){
        textBox1_Enter(sender, e);
    }

private void textBox1_Enter(object sender, EventArgs e){
        TextBox tb = ((TextBox)sender);
        tb.SelectAll();
    }

컨트롤을 탭하여 초점을 맞출 수 없습니다. 또한 모두 선택하지 않고 일부 텍스트를 선택하려는 경우는 어떻습니까?
유다 가브리엘 히 망고

실제로, 그것은 탭으로 작동합니다! 방금 MS Visual C # 2010을 사용하여 더미 프로젝트에서 테스트했습니다.이 솔루션의 성가신 것은 모두 선택하지 않고 텍스트를 선택할 수 없다는 것입니다. 그렇게하고 싶다면 물론 코드가 필요하지 않습니다. 마우스를 사용하고 선택하거나 키보드를 사용하면됩니다.
Pieter Heemeryck

이것이 바로이 솔루션이 제시된 문제를 해결하지 못하는 이유입니다. 모든 텍스트를 선택하지 않으면 주소의 개별 부분을 클릭 할 수 없기 때문에 브라우저 주소 상자처럼 작동하지 않습니다.
유다 가브리엘 히 망고

좋아, 무슨 말인지 알 겠어 질문의 제목과 웹 브라우저의 주소 표시 줄 예제에서 텍스트의 일부를 선택할 수 있어야한다고 표시하지 않았습니다. 당신은 당신의 질문의 마지막 문장의 한 측면으로 이것을 언급했습니다. 문안 인사.
Pieter Heemeryck

0
private bool _isSelected = false;
private void textBox_Validated(object sender, EventArgs e)
{
    _isSelected = false;
}

private void textBox_MouseClick(object sender, MouseEventArgs e)
{
    SelectAllText(textBox);
}

private void textBox_Enter(object sender, EventArgs e)
{
    SelectAllText(textBox);
}

private void SelectAllText(TextBox text)
{
    if (!_isSelected)
    {
        _isSelected = true;
        textBox.SelectAll();
    }
}

방금 RichTextBox로 테스트했습니다. 작동하지 않습니다. 텍스트 상자를 클릭해도 모든 텍스트를 선택할 수있는 것은 아닙니다. (이 마우스 아래에 해제하기 때문에 캐럿은 커서 위치에 배치 할 때.)
유다 가브리엘 희망 고

0

흥미롭게도 DropDownStyle = Simple을 사용하는 ComboBox에는 원하는 동작이 거의 있습니다.

(컨트롤의 높이를 줄여 목록을 표시하지 않으면 몇 픽셀 더 많이 표시하면 ComboBox와 TextBox 사이에 효과적인 차이가 없습니다.)


흥미롭지 만 TextBox 및 RichTextBox에서 작동하려면 실제로 필요합니다.
유다 가브리엘 히 망고

0

왜 텍스트 상자의 MouseDown-Event를 사용하지 않습니까? 그것은 나를 위해 잘 작동하고 추가 부울이 필요하지 않습니다. 예를 들어 매우 깨끗하고 간단합니다.

private void textbox_MouseDown(object sender, MouseEventArgs e) {
    if (textbox != null && !string.IsNullOrEmpty(textbox.Text))
    {
        textbox.SelectAll();
    } }

아니, 이것에 대한 몇 가지 문제 : 텍스트 상자에 이미 포커스가 있는지 여부를 고려하지 않습니다 (텍스트 상자에 포커스가 없었던 경우에만 마우스를 모두 아래로 선택하고 싶지는 않습니다). 텍스트의 일부를 탭하면 텍스트 상자에 탭을 통해 포커스를 가져올 때 작동하지 않습니다.
유다 가브리엘 희망 고

0

MouseUp 이벤트 내에서 SelectAll을 호출했는데 제대로 작동했습니다.

    private bool _tailTextBoxFirstClick = false;

    private void textBox1_MouseUp(object sender, MouseEventArgs e)
    {
        if(_textBoxFirstClick)           
            textBox1.SelectAll();

        _textBoxFirstClick = false;
    }  

    private void textBox1_Leave(object sender, EventArgs e)
    {
        _textBoxFirstClick = true;
        textBox1.Select(0, 0);
    }

예, 이것이 모든 시나리오에서 작동하지 않는 이유는 다른 답변 (및 의견)을 참조하십시오.
유다 가브리엘 히 망고

이 솔루션의 탭을 확인하지 않았습니다. 내 잘못이야. 지적 해 주셔서 감사합니다. 이제 완벽한 솔루션을 보유하게되어 기쁩니다. 또한 MouseUp에 대한 제안이 솔루션에 포함되어 있음을 알게되어 기쁩니다.
Sreejith K.

0

TextBox 또는 MaskedTextBox에서 클래스를 파생하십시오.

public class SMaskedTextBox : MaskedTextBox
{
    protected override void OnGotFocus(EventArgs e)
    {
        base.OnGotFocus(e);
        this.SelectAll();
    }
}

그리고 당신의 양식에 사용하십시오.


작동하지 않습니다. 이유를 이해하려면 다른 답변과 의견을 참조하십시오.
유다 가브리엘 히 망고


0

실제로 GotFocus는 관심있는 이벤트 (실제 메시지)입니다. 컨트롤에 어떻게 접근하든 결국에는 결과를 얻을 수 있기 때문입니다. 문제는 언제 SelectAll ()을 호출 하는가입니다.

이 시도:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.textBox1.GotFocus += new EventHandler(textBox1_GotFocus);
    }

    private delegate void SelectAllDelegate();    
    private IAsyncResult _selectAllar = null; //So we can clean up afterwards.

    //Catch the input focus event
    void textBox1_GotFocus(object sender, EventArgs e)
    {
        //We could have gotten here many ways (including mouse click)
        //so there could be other messages queued up already that might change the selection.
        //Don't call SelectAll here, since it might get undone by things such as positioning the cursor.
        //Instead use BeginInvoke on the form to queue up a message
        //to select all the text after everything caused by the current event is processed.
        this._selectAllar = this.BeginInvoke(new SelectAllDelegate(this._SelectAll));
    }

    private void _SelectAll()
    {
        //Clean-up the BeginInvoke
        if (this._selectAllar != null)
        {
            this.EndInvoke(this._selectAllar);
        }
        //Now select everything.
        this.textBox1.SelectAll();
    }
}

알리,이 작동하지 않습니다. 텍스트 중간에 마우스를 대고보십시오. 마우스 버튼을 1 초 동안 누르십시오.
유다 가브리엘 히 망고

0

양식의 텍스트 상자 그룹의 경우 :

private System.Windows.Forms.TextBox lastFocus;   

private void textBox_GotFocus(object sender, System.Windows.Forms.MouseEventArgs e)   
{
    TextBox senderTextBox = sender as TextBox;
    if (lastFocus!=senderTextBox){
        senderTextBox.SelectAll();
    }
    lastFocus = senderTextBox;   
}

1
이것은 제대로 작동하지 않습니다. .SelectAll ()을 제안하는 다른 답변에 대한 답장을 참조하십시오. 텍스트를 선택하려고 할 때 텍스트 상자를 입력하면 모든 텍스트를 선택하여 텍스트 선택을 중단하기 때문에 작동하지 않습니다. 포커스가 마우스를 통해 텍스트 상자에 입력되거나 텍스트를 탭한 경우에만 텍스트를 선택하려고하지만 마우스 아래로 포커스가 발생한 경우에만 텍스트를 선택하려고합니다.
유다 가브리엘 히 망고

0

나는 이것이 이미 해결되었다는 것을 알고 있지만 실제로는 간단하다고 생각합니다.

마우스 업 이벤트에서는 장소 만 있으면됩니다

if(textBox.SelectionLength = 0)
{
    textBox.SelectAll();
}

VB.NET에서 나를 위해 작동하는 것 같습니다 (이것은 C # 질문입니다 ... 슬프게도 내 직장에서 VB를 사용해야합니다. )

나는 아직 어떤 문제도 발견하지 못했다.. 클릭에서 즉시 선택하지 않는다는 사실을 제외하고는 문제가 있었다.


1
원래 요청은 필드를 탭할 때도 작동하기를 원했습니다.
Don Kirkby

2
그러나 모든 시나리오에서 작동하지는 않습니다. 텍스트 상자를 클릭 할 때만 작동합니다. 그럼에도 불구하고 브라우저 주소 표시 줄로 동작하지 않으면 텍스트 상자에 선택 항목이 이미있을 때 동작합니다.
유다 가브리엘 히 망고

0

다음 해결책이 저에게 효과적입니다. 나는 추가 OnKeyDownOnKeyUp이벤트 우선은 항상 선택 텍스트 상자의 텍스트를 유지.

    public class NumericTextBox : TextBox
{
    private bool _focused;
    protected override void OnGotFocus(EventArgs e)
    {
        base.OnGotFocus(e);
        if (MouseButtons == MouseButtons.None)
        {
            this.SelectAll();
            _focused = true;
        }
    }
    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        if (MouseButtons == MouseButtons.None)
        {
            SelectAll();
            _focused = true;
        }
    }

    protected override void OnLeave(EventArgs e)
    {
        base.OnLeave(e);
        _focused = false;
    }

    protected override void OnMouseUp(MouseEventArgs mevent)
    {
        base.OnMouseUp(mevent);
        if (!_focused)
        {
            if (SelectionLength == 0)
                SelectAll();
            _focused = true;
        }
    }

    protected override void OnKeyUp(KeyEventArgs e)
    {
        base.OnKeyUp(e);

        if (SelectionLength == 0)
            SelectAll();
        _focused = true;
    }
    protected override void OnKeyDown(KeyEventArgs e)
    {
       base.OnKeyDown(e);
       if (SelectionLength == 0)
            SelectAll();
        _focused = true;
    }
}

2
텍스트 상자로 마우스를 가져 가서 커서를 끌어서 텍스트를 선택한 다음 위로 마우스를 가져갈 수 있습니까?
유다 가브리엘 히 망고

0

컨트롤을 떠날 때 시작을 설정하십시오. 돌아올 때 거기에있을 것입니다. 폼 주위를 탭하고 컨트롤로 돌아 오면 모든 텍스트가 선택됩니다.

마우스로 들어가면 클릭 한 지점에 캐럿이 올바르게 배치됩니다.

private void maskedTextBox1_Leave(object sender, CancelEventArgs e)
    {
        maskedTextBox1.SelectAll();
    }

마우스로 들어가면 이미 초점이 맞지 않는 한 모든 텍스트를 선택해야합니다. 이를 지원하지 않습니다.
유다 가브리엘 히 망고

0

매우 간단한 해결책 :

    private bool _focusing = false;

    protected override void OnEnter( EventArgs e )
    {
        _focusing = true;
        base.OnEnter( e );
    }

    protected override void OnMouseUp( MouseEventArgs mevent )
    {
        base.OnMouseUp( mevent );

        if( _focusing )
        {
            this.SelectAll();
            _focusing = false;
        }
    }

편집 : 원본 OP는 특히 마우스 다운 / 텍스트 선택 / 마우스 업 시퀀스에 대해 염려했습니다.이 경우 위의 간단한 솔루션은 텍스트가 부분적으로 선택됩니다.

이것은 문제를 해결해야한다 * (실제로 WM_SETCURSOR를 가로 챈다) :

    protected override void WndProc( ref Message m )
    {
        if( m.Msg == 32 ) //WM_SETCURSOR=0x20
        {
              this.SelectAll(); // or your custom logic here                
        }

        base.WndProc( ref m );
    }

* 실제로 다음 순서는 부분 텍스트 선택으로 끝나지만 텍스트 상자 위로 마우스를 움직이면 모든 텍스트가 다시 선택됩니다.

마우스 다운 / 텍스트 선택 / 마우스 이동 텍스트 상자 / 마우스 업


이 솔루션은 이미 게시되었습니다. 작동하지 않는 이유를 알아 보려면 기존 답변에 대한 주석을 참조하십시오.
유다 가브리엘 히 망고

탭과 마우스로 작동하면 포커스를 얻고 텍스트를 선택한 다음 마우스를 위로 올릴 수 있습니다. 이 문제를 찾을 수없는 것 같습니다. 그 점을 지적 해 주시겠습니까?
마우로 삼 피에트로

0

마우스 클릭으로 즉시 해제되지 않으면이 작업이 가장 좋습니다.

    private bool SearchBoxInFocusAlready = false;
    private void SearchBox_LostFocus(object sender, RoutedEventArgs e)
    {
        SearchBoxInFocusAlready = false;
    }

    private void SearchBox_PreviewMouseUp(object sender, MouseButtonEventArgs e)
    {
        if (e.ButtonState == MouseButtonState.Released && e.ChangedButton == MouseButton.Left &&
            SearchBox.SelectionLength == 0 && SearchBoxInFocusAlready == false)
        {
            SearchBox.SelectAll();
        }

        SearchBoxInFocusAlready = true;
    }

0

내 솔루션은 매우 원시적이지만 내 목적에 적합합니다.

private async void TextBox_GotFocus(object sender, RoutedEventArgs e)
{
    if (sender is TextBox)
    {
        await Task.Delay(100);
        (sender as TextBox).SelectAll();
    }
}

아래로 마우스를 움직여 텍스트를 선택하고 마우스를 드래그 한 다음 마우스를 위로 올리려면 작동하지 않습니다. 코드는 선택을 지우고 모든 것을 선택합니다.
유다 가브리엘 히 망고

@JudahHimango Jup. 한 번 클릭하면 모든 것이 선택됩니다. 클릭하고 드래그하면 선택 항목 만 선택됩니다. 적어도 Firefox의 Browserbar는이 동작을 정확하게 보여줍니다.
BlueWizard

그래도 경쟁 조건이 아닌가? 마우스로 텍스트를 빠르게 선택하면 .SelectAll ()이 밀리 초 후에 실행되어 선택 항목을 덮어 씁니다.
유다 가브리엘 히 망고

1
좋아, 당신이 물건을 선택하는 것이 빠르면이 일이 당신에게 불리 할 것입니다.
BlueWizard

-1

아래는 작동하는 것 같습니다. enter 이벤트는 컨트롤에 대한 탭을 처리하고 컨트롤을 클릭하면 MouseDown이 작동합니다.

    private ########### void textBox1_Enter(object sender, EventArgs e)
    {
        textBox1.SelectAll();
    }

    private void textBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (textBox1.Focused)
            textBox1.SelectAll();
    }

운이 없어요, 작동하지 않습니다. 텍스트를 선택하십시오. .SelectAll 텍스트는 사용자가 선택하려고하는 내용을 덮어 씁니다.
유다 가브리엘 히 망고

-1

대답은 실제로 위의 모든 것보다 훨씬 간단 할 수 있습니다 (예 : WPF).

public void YourTextBox_MouseEnter(object sender, MouseEventArgs e)
    {
        YourTextBox.Focus();
        YourTextBox.SelectAll();
    }

물론이 코드를 어떻게 사용하고 싶은지 알 수 없지만 여기서 볼 주요 부분은 다음과 같습니다. 먼저 .Focus ()를 호출 한 다음 .SelectAll ()을 호출합니다.


이것은 작동하지 않으며 다른 답변과 중복됩니다. 예를 들어 텍스트 상자에서 마우스를 아래로 끌면 텍스트의 일부를 선택해야합니다. 이것은 그것을 깨뜨리고 모두 선택하지는 않습니다.
유다 가브리엘 히 망고

-1

enter 및 click 이벤트에서 selectall ()을 사용하십시오.

private void textBox1_Enter(object sender, EventArgs e)
        {

            textBox1.SelectAll();
        }
        private void textBox1_Click(object sender, EventArgs e)
        {
            textBox1.SelectAll();
        }

텍스트를 선택하기 전까지는 작동합니다. 자세한 설명은 다른 답변을 참조하십시오.
유다 가브리엘 히 망고

-1

새로운 VB.Net Wpf 프로젝트를 만들었습니다. 하나의 TextBox를 만들고 코드 숨김에 다음을 사용했습니다.

Class MainWindow 

    Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        AddHandler PreviewMouseLeftButtonDown, New MouseButtonEventHandler(AddressOf SelectivelyIgnoreMouseButton)
        AddHandler GotKeyboardFocus, New KeyboardFocusChangedEventHandler(AddressOf SelectAllText)
        AddHandler MouseDoubleClick, New MouseButtonEventHandler(AddressOf SelectAllText)
    End Sub

    Private Shared Sub SelectivelyIgnoreMouseButton(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
        ' Find the TextBox
        Dim parent As DependencyObject = TryCast(e.OriginalSource, UIElement)
        While parent IsNot Nothing AndAlso Not (TypeOf parent Is TextBox)
            parent = VisualTreeHelper.GetParent(parent)
        End While

        If parent IsNot Nothing Then
            Dim textBox As Object = DirectCast(parent, TextBox)
            If Not textBox.IsKeyboardFocusWithin Then
                ' If the text box is not yet focussed, give it the focus and
                ' stop further processing of this click event.
                textBox.Focus()
                e.Handled = True
            End If
        End If
    End Sub

    Private Shared Sub SelectAllText(ByVal sender As Object, ByVal e As RoutedEventArgs)
        Dim textBox As Object = TryCast(e.OriginalSource, TextBox)
        If textBox IsNot Nothing Then
            textBox.SelectAll()
        End If
    End Sub

End Class
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.