2008-10-06 13 views
5

Ustawienie TextBox jest ustawione na AutoPostback, ponieważ zmiana wartości powinna spowodować ponowne obliczenie i wyświetlenie wielu pól (wyświetlanych).
To działa dobrze.Funkcja AutoPostback z funkcją TextBox traci ostrość

Jednak, gdy pole zostanie zapisane w kartach, ostrość krótko przechodzi do następnego pola, a następnie znika, gdy strona jest przerysowana, więc nigdzie nie ma fokusu.

Chcę, aby fokus znajdował się na nowym polu, a nie na polu tekstowym, które właśnie zmieniłem. Czy istnieje sposób sprawdzenia, na którym polu skupiono się i zmusić go do ponownego pobrania, gdy strona zostanie przerysowana?

Odpowiedz

3

To jest "zgodne z projektem". Jeśli używasz programu ASP.NET 2.0+, możesz spróbować wywołać metodę Focus swojego TextBox po wystąpieniu odświeżenia (najlepiej w zdarzeniu TextChanged w TextBox).

Nie jestem pewien, czy istnieje jakiś wbudowany sposób śledzenia ostrości, ale znalazłem artykuł w CodeProject, który powinien wystarczyć.

+0

Problemem jest to, że trzeba ustawić ostrość na kontroli przeniesiona do. Czy istnieje sposób na identyfikację? –

+0

Dzięki za odpowiedź, korchev, ale to nie jest to, czego chcę. Wyjaśniłem moje pytanie. –

+0

Wypróbowaliśmy kilka, które nie działały. Twój zrobił. Dzięki, Korchev. –

1

Można także rozważyć odświeżenie pól wyświetlanych tylko przy użyciu AJAX UpdatePanel. W ten sposób nie stracisz ostrości z nowego pola.

Mam również proponowaną czystą stronę serwera solution opartą na WebControl.Controls.TabIndex analizy, możesz go użyć, jeśli chcesz.

1

To, co się dzieje:

1) TAB na polu - wydarzenie klient
2) Koncentracja na następnym polu - wydarzenie klient
3) Postback - zdarzenie serwer
4) odświeżana strona - klient impreza nowa strona nadpisuje preious zdarzenia klienckie

rozwiązaniem problemu jest:

a) uzyskać element, który zyskał ostrość PRZED ogłaszania

<script> 
var idSelected; 
$("input").focusin(function() { 
     idSelected = this.id; 
    }); 
</script> 

b) przechowywanie ClientID (w rzeczywistości w var idSelected) gdzie (tj ukryty tekstowym vith ViewState = true) PRZED postback

** b) get ClientID ** (wyciąg z ukrytej TextBox i umieścić go w var idSelected) PO odświeżenie

d) uzyskać element z ClientID i ustawić skupić PO odświeżenie

<script> 
$(document).ready(function() { 
    if (idSelected != null) { 
     $("#" + idSelected).focus(); 
     idSelected = null; 
    }); 
}); 
</script> 

Uwaga: to przykładowe skrypty używać JQuery.
Pamiętaj, aby umieścić Jquery.js w rozwiązania i odniesienie na stronie

<form id="form1" runat="server" enctype="multipart/form-data" method="post"> 
    <asp:ScriptManager runat="server" > 
    <Scripts> 
    <asp:ScriptReference Path="~/Scripts/jquery.js" ScriptMode="Auto" /> 
.... 

UWAGA2: to rozwiązanie działa bez AJAX.
Spójrz na this answer: JavaScript, aby praca nad Ajax należy użyć kodu:

<script type="text/javascript"> 
    Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler); 

    function EndRequestHandler(sender, args) 
    { 
    MyScript(); 
    } 
</script> 
+0

To było dla mnie bardzo przydatne rozwiązanie, mimo że musiałem je połączyć w 'Sys.Application.add_load (LoadHandler)' (gdzie 'LoadHandler' jest tylko funkcją), aby były one wywoływane ponownie na poczcie zwrotnej. Dzięki! –

Powiązane problemy