Requête LINQ vers WebControl.Controls
-
05-07-2019 - |
Question
J'ai trois contrôles TextBox sur la page
<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True"
OnTextChanged="TextBox_TextChanged" TabIndex="1">
<asp:TextBox ID="TextBox2" runat="server" AutoPostBack="True"
OnTextChanged="TextBox_TextChanged" TabIndex="2">
<asp:TextBox ID="TextBox3" runat="server" AutoPostBack="True"
OnTextChanged="TextBox_TextChanged" TabIndex="3">
et un gestionnaire d'événements
protected void TextBox_TextChanged(object sender, EventArgs e)
{
WebControl changed_control = (WebControl)sender;
var next_controls = from WebControl control in changed_control.Parent.Controls
where control.TabIndex > changed_control.TabIndex
orderby control.TabIndex
select control;
next_controls.DefaultIfEmpty(changed_control).First().Focus();
}
Ce code a pour but de sélectionner automatiquement TextBox avec le prochain TabIndex après la publication de la page suivante (voir Le problème de Little JB ). En réalité, je reçois InvalidCastException car il est impossible de transtyper à partir de System.Web.UI.LiteralControl (WebControl.Controls contient en fait LiteralControls) en System.Web.UI.WebControls.WebControl.
Je suis intéressé est-il possible de modifier cette approche en quelque sorte pour recevoir une solution de travail? Merci!
La solution
from control in changed_control
.Parent
.Controls
.OfType<WebControl>()
Autres conseils
Vous devriez pouvoir utiliser la méthode OfType pour ne renvoyer que les contrôles d'un type donné.
par exemple.
var nextcontrols = from WebControl control in
Changed_control.Parent.Controls.OfType<TextBox>()... etc
Le problème est que LiteralControl n’hérite pas de WebControl. Cependant, il ne peut pas avoir le focus, donc c'est bien de ne pas les sélectionner. Dans votre instruction LINQ, ajoutez une autre condition vérifiant un contrôle Web. Donc, votre ligne where devrait être where control.TabIndex > modified_control.TabIndex & amp; & amp; le contrôle est WebControl
.