Définir le Focus au Contrôle Après la Publication

D'abord, j'ai 3 zones de texte, liste déroulante, Case à cocher, et 2 LinkButtons dans une table. Les zones de texte et DropDownList doit faire une AutoPostBack parce qu'il y a certains calculs fait sur le côté serveur qui l'a appelé par OnTextChanged.

Mon problème ici est que d'après le contenu de tout Contrôle (ce qui nécessite un PostBack) les modifications et que vous tentez de déplacer le focus à n'importe quel autre Contrôle sur la page (qu'il s'agisse de tabulation ou à l'aide de la souris, cliquez sur n'importe quel autre Contrôle) le curseur ne se déplace pas vers le prochain point de Contrôle ou le Contrôle sur lequel vous avez cliqué.

J'ai essayé d'utiliser une méthode qui trouve le Contrôle en cours et sur la base des TabIndex, ajoute 1 qui se déplace le focus sur le contrôle suivant. Le problème ici est qu'il ne permet pas de se concentrer à être fixé sur n'importe quel autre Contrôle autre que celui avec le prochain TabIndex. Pour mieux expliquer ici est un exemple de la situation.

Exemple: j'ai TextBox1, TextBox2, et TextBox3. - Je modifier le contenu en TextBox2 souhaitez ensuite passer vers l'arrière pour TextBox1. Quand je clique dans TextBox1 le focus est mis à TextBox3 étant donné que le code est l'aide de l'ordre de la propriété TabIndex. ** Un facteur clé ici est que TextBox1 NE se concentrer avant que le serveur de code côté des feux mais perd le focus et la met sur la TextBox3 **

Pour moi, il semble que la seule façon dont ceci peut être accompli serait d'ajouter une fonction sur le côté client qui trouve le Contrôle avec la mise au point avant la Publication se produit, réinitialisez l'accent sur le Contrôle après le code côté serveur est terminée. Il ne semble pas que ce que je fais sur le serveur côté travail, puisque l'accent a déjà été perdu lorsque cela se produit.

J'ai cherché et cherché mais n'ont pas été en mesure de trouver une solution à ce problème particulier, tout ce que j'ai trouvé traite de la mise au point à la commande SUIVANTE à la place de la commande que vous souhaitez avoir le focus. Toute aide serait grandement appréciée. Je vous remercie à l'avance.

Ici c'est le code que j'utilise pour passer à la prochaine commande basée sur le TabIndex mais cela ne fonctionne pas dans ma situation.

protected void Page_Load(object sender, EventArgs e)
{
WebControl ctrl = GetPostBackControl() as WebControl;
if (ctrl != null && !SetNextFocus(Controls, ctrl.TabIndex + 1)) { ctrl.Focus(); }
}
public Control GetPostBackControl()
{
Control control = null;
string ctrlname = Request.Params.Get("__EVENTTARGET");
if (ctrlname != null && ctrlname != string.Empty)
{
control = FindControl(ctrlname);
control.Focus();
}
else
{
foreach (string ctl in Request.Form)
{
Control c = FindControl(ctl);
if (c is Button)
{
control = c;
break;
}
}
}
return control;
}
private bool SetNextFocus(ControlCollection controls, int tabIndex)
{
foreach (Control control in controls)
{
if (control.HasControls())
{
bool found = SetNextFocus(control.Controls, tabIndex);
if (found) { return true; }
}
WebControl webControl = control as WebControl;
if (webControl == null) { continue; }
if (webControl.TabIndex != tabIndex) { continue; }
webControl.Focus();
return true;
}
return false;
}

OriginalL'auteur Brian | 2011-09-06