LINQ-Abfrage zu WebControl.Controls
-
05-07-2019 - |
Frage
Ich habe drei Textboxsteuerelemente auf der Seite
<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">
und ein Event-Handler
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();
}
Die Bedeutung dieses Codes ist automatisch wählen TextBox mit dem nächsten TabIndex nach Seite Post zurück (siehe Little JB das Problem ). In Wirklichkeit erhalte ich InvalidCastException, weil sie von System.Web.UI.LiteralControl zu werfen (WebControl.Controls enthält tatsächlich LiteralControls) zu System.Web.UI.WebControls.WebControl unmöglich ist.
Ich interessiere mich ist es möglich, diese aproach zu modifizieren irgendwie Arbeitslösung zu erhalten? Vielen Dank!
Lösung
from control in changed_control
.Parent
.Controls
.OfType<WebControl>()
Andere Tipps
Sie sollten die OfType Methode verwenden können, um nur Kontrollen eines bestimmten Typs zurück.
z.
var nextcontrols = from WebControl control in
Changed_control.Parent.Controls.OfType<TextBox>()... etc
Das Problem ist, dass LiteralControl nicht von WebControl erbt. Es kann allerdings nicht den Fokus hat, so ist es OK, um sie nicht zu wählen. In Ihrer LINQ-Anweisung, fügen Sie eine weitere Bedingung für eine WebControl überprüfen. So where Linie where control.TabIndex > changed_control.TabIndex && control is WebControl
werden sollte.