.net - resolvidos - introdução a linguagem de programação c# pdf




Fazendo um WinForms TextBox se comportar como barra de endereços do seu navegador (20)

É um pouco chocante, mas no seu evento click, use SendKeys.Send( "{HOME}+{END}" ); .

Quando uma caixa de texto C # WinForms recebe foco, quero que ela se comporte como a barra de endereços do seu navegador.

Para ver o que quero dizer, clique na barra de endereços do seu navegador. Você notará o seguinte comportamento:

  1. Clicar na caixa de texto deve selecionar todo o texto se a caixa de texto não estiver focalizada anteriormente.
  2. Passe o mouse para baixo e arraste na caixa de texto para selecionar apenas o texto que destaquei com o mouse.
  3. Se a caixa de texto já estiver focada, clicar em não seleciona todo o texto.
  4. Focando a caixa de texto de forma programática ou através de tabulação de teclado deve selecionar todo o texto.

Eu quero fazer exatamente isso no WinForms.

FASTEST GUN ALERT: por favor leia o seguinte antes de responder! Obrigado rapazes. :-)

Chamar .SelectAll () durante os eventos .Enter ou .GotFocus não funcionará, porque se o usuário clicar na caixa de texto, o cursor será colocado onde ele clicou, desmarcando todo o texto.

Chamar .SelectAll () durante o evento .Click não funcionará porque o usuário não poderá selecionar qualquer texto com o mouse; a chamada .SelectAll () continuará sobrescrevendo a seleção de texto do usuário.

Chamar BeginInvoke ((Action) textbox.SelectAll) no focus / enter event enter não funciona porque quebra a regra # 2 acima, ele continuará substituindo a seleção do usuário no foco.


A resposta pode ser realmente muito mais simples do que todas as opções acima, por exemplo (no WPF):

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

É claro que não posso saber como você deseja usar esse código, mas a parte principal é: Primeiro, chame .Focus () e, em seguida, chame .SelectAll ();


Apenas derive uma classe de TextBox ou MaskedTextBox:

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

E use em seus formulários.


Aqui está uma função auxiliar que leva a solução para o próximo nível - reutilize sem herança.

    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();
            }   
        });
    }

Para usar isto simplesmente chame a função passando um TextBox e cuide de todos os bits bagunçados para você. Eu sugiro ligar todas as suas caixas de texto no evento Form_Load. Você pode colocar esta função em sua forma, ou se você gosta de mim, em algum lugar em uma classe de utilidade para ainda mais reutilização.


Curiosamente, uma caixa de combinação com DropDownStyle = Simple tem praticamente exatamente o comportamento que você está procurando, eu acho.

(Se você reduzir a altura do controle para não mostrar a lista - e então por um par de pixels a mais - não há diferença efetiva entre o ComboBox e o TextBox.)


Defina a seleção quando sair do controle. Ele estará lá quando você voltar. Tabule ao redor do formulário e quando você retornar ao controle, todo o texto será selecionado.

Se você entrar pelo mouse, o cursor será colocado corretamente no ponto em que você clicou.

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

Eu chamei SelectAll dentro do evento MouseUp e funcionou bem para mim.

    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);
    }

Eu encontrei uma solução ainda mais simples:

Para garantir que todo o texto seja selecionado ao clicar em uma caixa de texto, verifique se o manipulador Click chama o manipulador Inserir. Não há necessidade de variáveis ​​extras!

Exemplo:

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();
    }

Eu sei que isso já foi resolvido, mas tenho uma sugestão que acho que é bem simples.

No evento do mouse, tudo o que você precisa fazer é colocar

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

Parece funcionar para mim no VB.NET (eu sei que isso é uma questão C # ... infelizmente eu sou forçado a usar o VB no meu trabalho .. e eu estava tendo esse problema, que é o que me trouxe aqui ... )

Eu não encontrei nenhum problema com ele ainda .. exceto pelo fato de que ele não seleciona imediatamente no clique, mas eu estava tendo problemas com isso ....


Isso está funcionando para mim no .NET 2005 -

    ' * if the mouse button is down, do not run the select all.
    If MouseButtons = Windows.Forms.MouseButtons.Left Then
        Exit Sub
    End If

 ' * OTHERWISE INVOKE THE SELECT ALL AS DISCUSSED.

Isto é similar à resposta popular de nzhenry , mas eu acho mais fácil não ter que subclasse:

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

Minha solução é bem primitiva, mas funciona bem para o meu propósito

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

O abaixo parece funcionar. O evento enter manipula a tabulação para o controle e o MouseDown funciona quando o controle é clicado.

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

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

Para um grupo de caixas de texto em um formulário:

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;   
}

Primeiro de tudo, obrigado por respostas! 9 respostas no total. Obrigado.

Más notícias: todas as respostas tinham algumas peculiaridades ou não funcionavam bem (ou de todo). Adicionei um comentário a cada uma das suas postagens.

Boas notícias: encontrei uma maneira de fazer isso funcionar. Essa solução é bastante simples e parece funcionar em todos os cenários (usando o mouse, selecionando texto, tabbing focus, etc.)

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();
    }
}

Tanto quanto eu posso dizer, isso faz com que uma caixa de texto se comporte exatamente como uma barra de endereços do navegador.

Espero que isso ajude o próximo cara que tenta resolver esse problema enganadoramente simples.

Mais uma vez obrigado, pessoal, por todas as suas respostas que me ajudaram a seguir o caminho correto.


SelectAll nunca trabalhou para mim.

Isso funciona.

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

Sua solução é boa, mas falha em um caso específico. Se você der o foco do TextBox selecionando um intervalo de texto em vez de apenas clicar, o sinalizador jáFocusado não será configurado como true, portanto, quando você clicar no TextBox uma segunda vez, todo o texto será selecionado.

Aqui está a minha versão da solução. Eu também coloquei o código em uma classe que herda TextBox, então a lógica é bem escondida.

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;
        }
    }
}

Uma resposta de uma linha que eu uso ... você pode estar se chutando ...

No evento Enter:

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


basta usar selectall () ao entrar e clicar em eventos

private void textBox1_Enter(object sender, EventArgs e)
        {

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

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();
    }
}




textbox