2016-04-13 7 views
0

Ich habe eine ASP.Net 4.5.1 Seite geschrieben in C#, die eine Anzahl von TextBoxen enthält. Wenn sich der Text in einer der TextBoxen ändert, möchte ich eine Methode aufrufen, die 1) die Schaltfläche Speichern aktiviert und b) den Fokus auf die TextBox mit dem nächsten TabIndex nach der TextBox verschiebt, die den PostBack ausgelöst hat. Hier ist mein Code so weit:Setzen Sie TabIndex auf Next Control in ASP.Net

protected void EnableSaveButton(object sender, EventArgs e) 
    { 
     if ((REQUEST_PHASE)this.CurrentPhaseID == REQUEST_PHASE.RECORDS) 
     { 
      btnSaveACProperty.Disabled = false; 
      Control control = (Control)sender; 
      int tabindex = 0; 
      if (control != null) 
      { 

      } 
     } 
    } 

Was ich tun möchte, ist die TabIndex Kontrolle geraten und dann finden die Steuerung mit TabIndex + 1 und machen Sie einen SetFocus() auf sie. Mein Problem ist, dass die Steuervariable in meinem Code keine Eigenschaft von TabIndex hat. Wie mache ich das?

+1

Die Seite zu verursachen, jedes Mal zurück zum Server zu posten, wenn ein Textkasten sich ändert, scheint eine schlechte Idee zu sein. Sie sollten dies in Javascript stattdessen tun. –

+0

Leider muss ich in meinem Code nach dieser.CurrentPhaseID suchen und tue dies nur, wenn es auf einen bestimmten Wert eingestellt ist. Ansonsten würde ich Javascript in Betracht ziehen. Aber ich kann entscheiden, CurrentPhaseID zu ignorieren, wenn dies am Backend zu einem Albtraum wird. Also danke für den Vorschlag. – Melanie

+1

Ja: https://stackoverflow.com/questions/7208161/focus-next-element-in-tab-index –

Antwort

0

Es ist eine schlechte Idee, die Seite zu veranlassen, jedes Mal, wenn eine Textbox geändert wird, zurück auf den Server zu schreiben. Es ist viel besser, so etwas in Javascript zu tun.

Die Antworten auf this question haben verschiedene Vorschläge für den Fokus auf die nächste Steuereinstellung, einschließlich a jQuery plugin, firing a keyboard event und navigating the DOM to find the next control.

$(function(){ 
    $("form").on("change", ":input", function(){ 
     $(":submit[name$=btnSaveACProperty]").prop("disabled", false); 
     $.tabNext(); 
    }); 
}); 

Es sollte ziemlich einfach sein, diese Funktionalität basierend auf einer Bedingung auf dem Server zu aktivieren oder zu deaktivieren. Wenn Sie das Javascript beispielsweise in eine externe Datei einfügen, können Sie es dann bedingungslos einschließen:

protected void Page_PreRender(object sender, EventArgs e) 
{ 
    switch ((REQUEST_PHASE)this.CurrentPhaseID) 
    { 
     case REQUEST_PHASE.RECORDS: 
     { 
      Page.ClientScript.RegisterClientScriptInclude(
       typeof(REQUEST_PHASE), "MoveFocusOnChange", 
       "~/scripts/moveFocusOnChange.js"); 
      break; 
     } 
    } 
} 
+0

Leider funktioniert die Jquery nicht. Es aktiviert weder die Schaltfläche noch die Tabs für das nächste Steuerelement. Das Untersuchen des DOM zeigt mir eine Formularsteuerung, in der alle meine anderen Tabellen und Steuerelemente liegen, also weiß ich nicht warum. Wenn Sie etwas einfaches vorschlagen können, das ich vermisse, großartig. Ansonsten lass es uns gehen lassen; Ich habe das Problem mit etwas klobigen Javascript gelöst. PS - der src, auf den ich für jquery zeige, ist die jquery-1.4.1.js, die in dem Projekt enthalten war, als es in .Net 2.0 erstellt wurde. – Melanie

+0

@Melanie: Das ist eine wirklich alte Version von jQuery! Die On-Methode wurde in 1.7 hinzugefügt; die "Delegierten" -Methode war in 1.4.3; Es sieht also so aus, als müssten Sie entweder [die 'live'-Methode] (https://api.jquery.com/live/) oder [die' change'-Methode] (https://api.jquery.com) verwenden/change /) um den Event-Handler anzuhängen. –

+0

Also wird die erste Zeile zu $ ​​("panel"). Live (function() {right? – Melanie