Consulta LINQ a WebControl.Controls
-
05-07-2019 - |
Pregunta
Tengo tres controles TextBox en la página
<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">
y un controlador de eventos
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();
}
El significado de este código es seleccionar TextBox automáticamente con el siguiente TabIndex después de la publicación de la página (ver El problema de Little JB ). En realidad recibo la excepción InvalidCastException porque es imposible emitir desde System.Web.UI.LiteralControl (WebControl.Controls contiene realmente LiteralControls) a System.Web.UI.WebControls.WebControl.
Estoy interesado, ¿es posible modificar este enfoque de alguna manera para recibir una solución de trabajo? ¡Gracias!
Solución
from control in changed_control
.Parent
.Controls
.OfType<WebControl>()
Otros consejos
Debería poder usar el método OfType para devolver solo los controles de un tipo determinado.
por ejemplo
var nextcontrols = from WebControl control in
Changed_control.Parent.Controls.OfType<TextBox>()... etc
El problema es que LiteralControl no hereda de WebControl. Sin embargo, no puede tener el foco, por lo que está bien no seleccionarlos. En su declaración LINQ, agregue otra condición que compruebe un control web. Por lo tanto, su línea donde debería estar donde control.TabIndex > changed_control.TabIndex & amp; & amp; el control es WebControl
.