2010-09-10 13 views
5

¿Hay una manera de encontrar los controles de hermanos anterior y siguiente en una forma ASP.net de código subyacente, similar a FindControl()?Encontrar el hermano anterior y el próximo controla

A veces no desea asignar una ID a un control solo para que pueda hacer una parent(). FindControl ("ID") para encontrarla. Estoy cansado de encontrar IDs cuando todo lo que podía hacer era previousControl() o algo así (a la jQuery).

Esto también sería útil en situaciones donde se escribe una función general para abordar varios controles que tienen un diseño similar y no quieren abordarlos uno por uno.

Gracias por cualquier sugerencia.

Respuesta

6

Para la posteridad, aquí es la función que terminé la escritura. Funciona muy bien (probado en un proyecto real):

public static Control PreviousControl(this Control control) 
    { 
     ControlCollection siblings = control.Parent.Controls; 
     for (int i = siblings.IndexOf(control) - 1; i >= 0; i--) 
     { 
      if (siblings[i].GetType() != typeof(LiteralControl) && siblings[i].GetType().BaseType != typeof(LiteralControl)) 
      { 
       return siblings[i]; 
      } 
     } 
     return null; 
    } 

Para utilizarse como esto:

Control panel = textBox.PreviousControl(); 

y para el control siguiente:

public static Control NextControl(this Control control) 
    { 
     ControlCollection siblings = control.Parent.Controls; 
     for (int i = siblings.IndexOf(control) + 1; i < siblings.Count; i++) 
     { 
      if (siblings[i].GetType() != typeof(LiteralControl) && siblings[i].GetType().BaseType != typeof(LiteralControl)) 
      { 
       return siblings[i]; 
      } 
     } 
     return null; 
    } 

La ventaja de esta solución sobre que de Atzoya es que, primero, no necesita el control original para tener una ID ya que hago la búsqueda en función de la instancia. En segundo lugar, debe saber que ASP.net genera varios controles Literales para renderizar su HTML estático entre sus controles "reales". Es por eso que los omito, o seguirás combinando basura. Por supuesto, la desventaja de esto es que no puedes encontrar un control si es un Literal. Esta limitación no fue un problema en mi uso.

1

No creo que hay una construida en función de esa manera, pero es muy fácil de extender la clase de control y añadir métodos para que de este modo:

public static Control PreviousControl(this Control control) 
{ 
    for(int i=0; i<= control.Parent.Controls.Count; i++) 
     if(control.Parent.Controls[i].Id == control.Id) 
     return control.Parent.Controls[i-1]; 
} 

Por supuesto, un poco más las necesidades de manipulación para hacer aquí (si no hay control previo u otros escenarios) pero creo que se da cuenta de cómo se podría hacer esto.

Después de escribir este método se puede llamar así como

Control textBox1 = textBox2.PreviousControl(); 
+3

Gracias por su sugerencia, pero tiene 2 números: en primer lugar se supone que el control original debe tener un ID, que no es bueno en mi caso. En segundo lugar, su función va a coincidir con los controles Literales que ASP.net genera para generar su HTML estático. Eso es un no ir. Vea mi propia solución para una versión que aborde todo eso. – md1337

Cuestiones relacionadas