none
Posicionar Cursor em TextBox WebForm

    Question

  • Boa-Tarde Amigos,

    Pesquisei aqui no forum e em outras comunidades e não achei nada referente a esta dúvida.

    O meu cenário é o seguinte.
    Tenho uma página com dois textbox (txt1 e txt2) e um botão.
    Quando digito algo no txt2 e clico no botão aparece o texto digitado no txt1, até ai ok sem novidades.

    Coloquei um scriptmanager ,updatepanel e um timer , somente o txt1 está dentro do updatepanel por "n" motivos.

    Configurei o timer para disparar em 20cm e com isso tenho o postback na página, o meu problema é, se estou digitando no txt2 e acontece o postback perco o foco no text2, gostaria de saber como posso fazer para retornar o foco extamente na posição em que estava digitando.
    Já que se eu fazer txt2.Focus(), o cursor retorna para a primeira posição o textbox .

    Agradeço a ajuda.

    Obrigado

    Wednesday, February 08, 2012 3:23 PM

Answers

  • Tenho uma aplicação muito parecida com o que você descreveu.

    Desenvolvi uma espécie de chat online para um jogo (Arcadia)

    Também enfrentei o mesmo problema.

    A solução é a seguinte.. O seu timer e o Txt1 devem estar dentro do Update Panel e o Txt2 deve estar fora.

    Dessa maneira, quando o timer realizar o PostBack da página ele irá atualizar somente os componentes presentes no Update Panel que ele se encontra. Assim o Txt2, que não está neste Update Panel não será recarregado e não irá perder o foco.

    Segue o código do meu programa:

    <asp:UpdatePanel ID="upChat" runat="server" UpdateMode="Conditional">
                <ContentTemplate>
                    <asp:Timer ID="Timer2" runat="server" Interval="1000" ontick="Timer2_Tick">
                    </asp:Timer>
                    
                    <div style="width: 560px; float: left; position: relative;">
                        <asp:TextBox ID="tbChat" runat="server" CssClass="input" TextMode="MultiLine" Width="100%" Height="200px" ReadOnly="true"></asp:TextBox>
                    </div>
                    <div class="grid divInterno" style="width: 200px; float: right; position: relative; background: #3C3C3C; height: 205px;">
                        <asp:GridView ID="gridEspectadores" runat="server" AutoGenerateColumns="true" CssClass="grid"
                            CellPadding="4" Font-Size="9pt" ForeColor="#CCCCCC" GridLines="None" 
                            ShowHeader="false" onrowdatabound="gridEspectadores_RowDataBound" >
                            <RowStyle BackColor="#F7F6F3" ForeColor="#333333" Width="100%" />
                            <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                            <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                            <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                            <HeaderStyle BackColor="#333333" Font-Bold="True" ForeColor="White" />
                            <EditRowStyle BackColor="#999999" />
                            <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                        </asp:GridView>
                    </div>
                </ContentTemplate>
            </asp:UpdatePanel>
    
            <table>
                <tr>
                    <td><asp:TextBox ID="tbEscreveMensagem" runat="server" CssClass="input" Width="695" onfocus="javascript: ctl00_Content_tbChat.scrollTop = ctl00_Content_tbChat.scrollHeight;"></asp:TextBox></td>
                    <td><asp:ImageButton ID="btEnviaMsg" runat="server" onclick="btEnviaMsg_Click" ImageUrl="Imagens/btenviar.png"/></td>
                </tr>
            </table>

    Espero ter ajudado,

    Grande abraço


    Luís Felipe - www.litesoftware.com.br

    Wednesday, February 08, 2012 5:35 PM

All replies

  • Boa tarde.

    Nao entendi muito bem a sua duvida, mas seria isso:

    tbPositionCursor.Select(tbPositionCursor.Text.Length, 0);

    Referencia:

    http://msdn.microsoft.com/pt-br/library/ms752349.aspx


    Consultoria .NET

    ANALISTA DESENVOLVEDOR
    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como resposta.

    Wednesday, February 08, 2012 4:37 PM
  • Consultoria .NET

    Obrigado pela resposta, mas não estou conseguindo acessar a propriedade Select de um textbox em WebForms, só consigo acessar essa propriedade em WindowsForm.

    Vou tentar explicar melhor.
    Tenho um textbox e minha página tem postback de 20 a 20cm, portanto quando estou escrevendo algo no textbox e a página da postback, perco o foco do textbox e seto o foco nele o cursor volta para primeira posição.

    Obs.: "|" (Significa a posição do cursor)

    Exemplo:

    Texto : bla bla bla|

    Quando a página posta:

    Text: |bla bla bla

    Oq preciso que aconteça

    Texto : bla bla bla|

    Quando a página posta:

    Text: bla bla bla|

    Ou seja preciso que o cursor permaneça na posição que estava antes do postback.

    Obrigado.





    Wednesday, February 08, 2012 5:19 PM
  • E desta forma:

    textBox1.Focus() '
    textBox1.SelectionStart = textBox1.TextLength


    Consultoria .NET

    ANALISTA DESENVOLVEDOR
    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como resposta.

    Wednesday, February 08, 2012 5:28 PM
  • Tenho uma aplicação muito parecida com o que você descreveu.

    Desenvolvi uma espécie de chat online para um jogo (Arcadia)

    Também enfrentei o mesmo problema.

    A solução é a seguinte.. O seu timer e o Txt1 devem estar dentro do Update Panel e o Txt2 deve estar fora.

    Dessa maneira, quando o timer realizar o PostBack da página ele irá atualizar somente os componentes presentes no Update Panel que ele se encontra. Assim o Txt2, que não está neste Update Panel não será recarregado e não irá perder o foco.

    Segue o código do meu programa:

    <asp:UpdatePanel ID="upChat" runat="server" UpdateMode="Conditional">
                <ContentTemplate>
                    <asp:Timer ID="Timer2" runat="server" Interval="1000" ontick="Timer2_Tick">
                    </asp:Timer>
                    
                    <div style="width: 560px; float: left; position: relative;">
                        <asp:TextBox ID="tbChat" runat="server" CssClass="input" TextMode="MultiLine" Width="100%" Height="200px" ReadOnly="true"></asp:TextBox>
                    </div>
                    <div class="grid divInterno" style="width: 200px; float: right; position: relative; background: #3C3C3C; height: 205px;">
                        <asp:GridView ID="gridEspectadores" runat="server" AutoGenerateColumns="true" CssClass="grid"
                            CellPadding="4" Font-Size="9pt" ForeColor="#CCCCCC" GridLines="None" 
                            ShowHeader="false" onrowdatabound="gridEspectadores_RowDataBound" >
                            <RowStyle BackColor="#F7F6F3" ForeColor="#333333" Width="100%" />
                            <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                            <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                            <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                            <HeaderStyle BackColor="#333333" Font-Bold="True" ForeColor="White" />
                            <EditRowStyle BackColor="#999999" />
                            <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                        </asp:GridView>
                    </div>
                </ContentTemplate>
            </asp:UpdatePanel>
    
            <table>
                <tr>
                    <td><asp:TextBox ID="tbEscreveMensagem" runat="server" CssClass="input" Width="695" onfocus="javascript: ctl00_Content_tbChat.scrollTop = ctl00_Content_tbChat.scrollHeight;"></asp:TextBox></td>
                    <td><asp:ImageButton ID="btEnviaMsg" runat="server" onclick="btEnviaMsg_Click" ImageUrl="Imagens/btenviar.png"/></td>
                </tr>
            </table>

    Espero ter ajudado,

    Grande abraço


    Luís Felipe - www.litesoftware.com.br

    Wednesday, February 08, 2012 5:35 PM
  • [lts] Luís Felipe

    Cara é isso mesmo, o problema é que eu não tinha colocado o timer dentro updatepanel.

    Obrigado!

    Wednesday, February 08, 2012 6:17 PM
  • Beleza, que bom que deu certo!
    De nada! Eu lembro que sofri com isso também na época

    Abraço, bom trabalho


    Luís Felipe - www.litesoftware.com.br

    Wednesday, February 08, 2012 6:20 PM