none
Aceitando um textBox RRS feed

  • Pergunta

  • Boa tarde pessoal.

    Vê se vocês podem me ajudar. Estou com o seguinte problema. Estou saindo um um textbox e entrando em outro. Esse novo textbox é um Decimal da seguinte forma 0,0000. Quando eu entro nesse textbox, o cursor fi apontando para antes do primeiro zero, ou seja, se eu quiser digitar 5 por cento ele fica assim: 50,0000. Eu gostaria que as informações do textbox viessem todas marcadas para assumir as informações que eu digitar. Não sei se me fiz entender,

    Garibaldo 

    terça-feira, 3 de outubro de 2017 15:42

Respostas

  • Boa dia GaribaldoGuerreiro,

      Vi um truque "sujíssimo" na internet para fazer funcionar, pura "gambiware"... funcionou comigo, mas não entendi 100%... Está em:

    https://social.msdn.microsoft.com/Forums/windows/en-US/68c30f52-bba3-48c9-bf59-84304b75068d/maskedtextbox-and-selectall?forum=winforms

      Parece que o "esquema" é fazer a "Mask" invocar (ou herdar?) a propriedade "SelectAll", desta forma:

        1º) Declare um "Mask" virtual no início do código:

    private delegate void SetMaskedTextBoxSelectAllDelegate(MaskedTextBox txtbox);

        2º) Adicione a nova função chamada "SetMaskedTextBoxSelectAll":

    private void SetMaskedTextBoxSelectAll(MaskedTextBox txtbox)
    {
        txtbox.SelectAll();
    }

        3º) Para testar, nos Eventos (aba ao lado das propriedades - símbolo do "raio") do Seu mask, procure um que se chama "Enter" e clique duas vezes. Acrescente o código:

    private void maskCpfCnpjFornecedor_Enter(object sender, EventArgs e)
    {
        this.BeginInvoke(new SetMaskedTextBoxSelectAllDelegate(SetMaskedTextBoxSelectAll), new object[] { (MaskedTextBox)sender });
    }

        Só tome cuidado, pois Eventos são muito sensíveis e NÃO podem ser digitados, mas precisam ser "clicados", por exemplo, se não funcionar o "SelectAll", veja se dentro dos Eventos do seu "Mask" existe a chamada para o "maskCpfCnpjFornecedor_Enter".

       O que eu quero dizer é que se você digitar ou se você colar o cabeçalho da função acima, NÃO vai funcionar, precisa fazer manualmente clicando duas vezes no evento da "Mask".

    =====================================================

       Fuçando mais, descobri um outro jeito de fazer selecionando "por botão":

       - Criei um botão chamado "btnFocoMaskTextbox2".

       Detalhe: A função "SetMaskedTextBoxSelectAll" ainda é usada!!!

       Ao clicar no botão, a "Mask" aceita o "SelectAll" e é obrigatório depois receber o foco.

       Para testar, não esqueça de comentar somente o conteúdo do Evento "Enter" , senão ele poderá assumir a função do foco...

    private void btnFocoMaskTextbox2_Click(object sender, EventArgs e)
    {
        maskCpfCnpjFornecedor.BeginInvoke(new SetMaskedTextBoxSelectAllDelegate(SetMaskedTextBoxSelectAll), new object[] { maskCpfCnpjFornecedor });
        maskCpfCnpjFornecedor.Focus();
    }

    []'s,

    Fabio I.

    • Editado Fabio I domingo, 5 de novembro de 2017 12:54
    • Marcado como Resposta GaribaldoGuerreiro domingo, 5 de novembro de 2017 16:09
    domingo, 5 de novembro de 2017 12:10

Todas as Respostas

  • GaribaldoGuerreiro,

       É simples. No Macoratti tem um exemplo em VB.Net:

    VB .NET - TextBox - Selecionar todo o texto ao receber o foco.

    http://www.macoratti.net/d190104.htm

    Private Sub Text1_GotFocus()
        ' selecionar o texto ao receber o foco
        With Text1
            .SelStart = 0
            .SelLength = Len(.Text)
        End With
    End Sub

         Traduzindo com o "http://converter.telerik.com/"

    private void Text1_GotFocus()
    {
    	// selecionar o texto ao receber o foco
    	var _with1 = Text1;
    	_with1.SelStart = 0;
    	_with1.SelLength = Strings.Len(_with1.Text);
    }
       Melhorando...

    private void Text1_GotFocus()
    {
    	// selecionar o texto ao receber o foco
    	Text1.SelStart = 0;
    	Text1.SelLength = Strings.Len(Text1.Text);
    }

    []'s,

    Fabio I.

    • Editado Fabio I terça-feira, 3 de outubro de 2017 17:23
    terça-feira, 3 de outubro de 2017 17:21
  • Boa noite Fabio

    Obrigado pela dica, porém, não consegui resolver o problema. no C# não consegui ler o String.Len dá erro.

    Olha como ficou: O Len não é encontrado. Pelo que li no Macoratti, não funcionou no evento ENTER. No Macoratti ele manda colocar assim: e não funcionou.

                txtAliquotaIcms.SelectAll();
                txtAliquotaIcms.SelectionStart = 0;
                txtAliquotaIcms.SelectionLength = String..Len(txtAliquotaIcms.Text);
    

    terça-feira, 3 de outubro de 2017 23:52
  • Troque por isto:

      txtAliquotaIcms.SelectionLength = txtAliquotaIcms.Text.Length;


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    quarta-feira, 4 de outubro de 2017 11:31
  • Boa dia GaribaldoGuerreiro,

        Pesquisando melhor o "SelectAll()" resolve, mas em ambas precisa ter um "Focus", por favor, tente assim:

    txtAliquotaIcms.SelectAll();
    txtAliquotaIcms.Focus();

        A forma anterior era...

    txtAliquotaIcms.SelectionStart = 0;
    txtAliquotaIcms.SelectionLength = txtAliquotaIcms.Text.Length;
    txtAliquotaIcms.Focus();

    []'s,

    Fabio I.

    • Editado Fabio I quarta-feira, 4 de outubro de 2017 12:33
    • Sugerido como Resposta Fabio I quarta-feira, 4 de outubro de 2017 12:33
    • Marcado como Resposta GaribaldoGuerreiro quarta-feira, 4 de outubro de 2017 12:57
    • Não Marcado como Resposta GaribaldoGuerreiro sábado, 4 de novembro de 2017 21:17
    quarta-feira, 4 de outubro de 2017 11:37
  • Boa noite Fábio

    Esse exemplo que você me Passou está funcionando perfeitamente quanto se trata de um valor decimal.

    Eu estou com o mesmo problema agora com um CNPJ

    Essa foi a rotina que eu criei:

            private void maskCpfCnpjFornecedor_Enter(object sender, EventArgs e)
            {
                maskCpfCnpjFornecedor.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals;
                maskCpfCnpjFornecedor.SelectionStart = 0;
                maskCpfCnpjFornecedor.SelectionLength = maskCpfCnpjFornecedor.Text.Length;
                maskCpfCnpjFornecedor.Focus();
            }
    

    sábado, 4 de novembro de 2017 21:21
  • Boa dia GaribaldoGuerreiro,

      Vi um truque "sujíssimo" na internet para fazer funcionar, pura "gambiware"... funcionou comigo, mas não entendi 100%... Está em:

    https://social.msdn.microsoft.com/Forums/windows/en-US/68c30f52-bba3-48c9-bf59-84304b75068d/maskedtextbox-and-selectall?forum=winforms

      Parece que o "esquema" é fazer a "Mask" invocar (ou herdar?) a propriedade "SelectAll", desta forma:

        1º) Declare um "Mask" virtual no início do código:

    private delegate void SetMaskedTextBoxSelectAllDelegate(MaskedTextBox txtbox);

        2º) Adicione a nova função chamada "SetMaskedTextBoxSelectAll":

    private void SetMaskedTextBoxSelectAll(MaskedTextBox txtbox)
    {
        txtbox.SelectAll();
    }

        3º) Para testar, nos Eventos (aba ao lado das propriedades - símbolo do "raio") do Seu mask, procure um que se chama "Enter" e clique duas vezes. Acrescente o código:

    private void maskCpfCnpjFornecedor_Enter(object sender, EventArgs e)
    {
        this.BeginInvoke(new SetMaskedTextBoxSelectAllDelegate(SetMaskedTextBoxSelectAll), new object[] { (MaskedTextBox)sender });
    }

        Só tome cuidado, pois Eventos são muito sensíveis e NÃO podem ser digitados, mas precisam ser "clicados", por exemplo, se não funcionar o "SelectAll", veja se dentro dos Eventos do seu "Mask" existe a chamada para o "maskCpfCnpjFornecedor_Enter".

       O que eu quero dizer é que se você digitar ou se você colar o cabeçalho da função acima, NÃO vai funcionar, precisa fazer manualmente clicando duas vezes no evento da "Mask".

    =====================================================

       Fuçando mais, descobri um outro jeito de fazer selecionando "por botão":

       - Criei um botão chamado "btnFocoMaskTextbox2".

       Detalhe: A função "SetMaskedTextBoxSelectAll" ainda é usada!!!

       Ao clicar no botão, a "Mask" aceita o "SelectAll" e é obrigatório depois receber o foco.

       Para testar, não esqueça de comentar somente o conteúdo do Evento "Enter" , senão ele poderá assumir a função do foco...

    private void btnFocoMaskTextbox2_Click(object sender, EventArgs e)
    {
        maskCpfCnpjFornecedor.BeginInvoke(new SetMaskedTextBoxSelectAllDelegate(SetMaskedTextBoxSelectAll), new object[] { maskCpfCnpjFornecedor });
        maskCpfCnpjFornecedor.Focus();
    }

    []'s,

    Fabio I.

    • Editado Fabio I domingo, 5 de novembro de 2017 12:54
    • Marcado como Resposta GaribaldoGuerreiro domingo, 5 de novembro de 2017 16:09
    domingo, 5 de novembro de 2017 12:10
  • Boa tarde Fábio,

    Eu também não entendi muito bem o processo, porém, asotei, testei e funcionou como eu queria. Agora vou tentar entender melhor o processo, porém, por enquanto muito obrigado pela ajuda.

    Garibaldo

    domingo, 5 de novembro de 2017 16:09
  • Garibaldo Guerreiro,

        Beleza, mas, por favor, poderia fechar esse Post e me pontuar? Agradeço.

    []'s,
    Fabio Ingenito.

    domingo, 5 de novembro de 2017 17:13