2010-06-01 8 views
7

Tengo un método que encuentra todos los controles, los repite, determina si son un cuadro de texto, una lista desplegable, etc. recupera su nombre ID, y dependiendo del nombre ID establecerá una declaración booleana (por lo tanto, sabría si esa sección del formulario está completa y enviará un correo electrónico a cierto grupo de personas) desafortunadamente, esto se hace con demasiadas declaraciones if y me preguntaba si podría obtener ayuda para hacer esto. más manejable¿Una mejor manera? Encontrar los controles ASP.NET, encontrar su ID

protected void getEmailGroup() 
{ 
    Control[] allControls = FlattenHierachy(Page); 
    foreach (Control control in allControls) 
    { 
     if (control.ID != null) 
     { 
      if (control is TextBox) 
      { 
       TextBox txt = control as TextBox; 
       if (txt.Text != "") 
       { 
        if (control.ID.StartsWith("GenInfo_")) 
        { 
         GenInfo = true; 
        } 
        if (control.ID.StartsWith("EmpInfo_")) 
        { 
         EmpInfo = true; 
        } 
       } 
      } 
      if (control is DropDownList) 
      { 
       DropDownList lb = control as DropDownList; 
       if (lb.SelectedIndex != -1) 
       { 
        if (control.ID.StartsWith("GenInfo_")) 
        { 
         GenInfo = true; 
        } 
        if (control.ID.StartsWith("EmpInfo_")) 
        { 
         EmpInfo = true; 
        } 
       } 
      } 
     } 
    } 
}  
+0

No creo que sea una buena idea usar comodines en nombres de control como ese excepto * quizás * cuando desarrolle un control personalizado realmente complicado a través de la composición. –

+0

Estoy desarrollando un control personalizado realmente complicado. Necesito revisar un formulario, determinar si se han completado ciertos campos y determinar quién recibirá solo ciertas partes del formulario. – Spooks

+0

tal vez la declaración del problema podría ser repensada y, por lo tanto, controlar el rediseño. ¿Desea saber qué partes de un formulario están completas? ¿Está agregando dinámicamente controles a su formulario? ¿Qué define una sección completa de un formulario - la existencia de un control con id = foo? – earthling

Respuesta

0

En lugar de utilizar la expresión Lambda He creado un método que controla el control para mí, y en función del nombre del control, se establece que el artículo es cierto

public bool setGroup(Control ctrl) 
    { 
     isAControl = false; 

     //set a section to true, so it will pull the html 
     if (ctrl.ID.StartsWith("GenInfo_")) 
     { 
      GenInfo = true; 
      lstControls.Add(ctrl.ID.Replace("GenInfo_", "")); 
      isAControl = true; 
      return isAControl; 
     } 

aquí es un pequeño fragmento de mi código. Solo quiero verificar ciertos controles (para acelerar las cosas) y revisar cada control ya que cada control tiene una manera diferente de obtener el valor (el cuadro de texto usaría .text donde dropdownlist usaría .selectedValue)

if(control is TextBox || control is DropDownList || control is RadioButton || control is RadioButtonList 
       || control is CheckBox || control is CheckBoxList) 
       { 
        if (control is TextBox) 
        { 
         TextBox txt = control as TextBox; 
         if (txt.Text != "" && txt.Text != "YYYY/MM/DD") 
         { 
          setGroup(control); 
          if (isAControl) 
          { 
           string controlNoGroup = lstControls.Last(); 
           strHtml = strHtml.Replace("@" + (controlNoGroup.ToString()) + "@", txt.Text); 
          } 
         } 
        } 
+0

si alguien puede mejorar en esto házmelo saber! funciona bien, al igual que para ser lo más eficiente posible – Spooks

4

¿Por qué no simplemente utilizar el método Control.FindControl (cadena)?

de: http://msdn.microsoft.com/en-us/library/486wc64h.aspx

private void Button1_Click(object sender, EventArgs MyEventArgs) 
{ 
     // Find control on page. 
     Control myControl1 = FindControl("TextBox2"); 
     if(myControl1!=null) 
     { 
     // Get control's parent. 
     Control myControl2 = myControl1.Parent; 
     Response.Write("Parent of the text box is : " + myControl2.ID); 
     } 
     else 
     { 
     Response.Write("Control not found"); 
     } 
} 
+0

Normalmente usaría un FindControl, lo único que tengo es más de 100 controles (algunos cuadros de texto, algunos de radio, algunos desplegables) y yo debe ir a través de ellos para determinar cuáles tienen valores y determinar a quién se enviarán. – Spooks

1

Es difícil entender la lógica detrás de su código, pero estoy seguro de que se puede escribir más fácil. Por ejemplo, usted puede hacer algo como esto:

DropDownBox box = FlattenHierachy(Page) 
    .Where(c => c is DropDownList) 
    .Cast<DropDownList>() 
    .Where(d => d.SelectedIndex != -1) 
    .FirstOrDefault(); 
if (box != null) 
{ 
    if (box.ID.StartsWith("GenInfo_")) 
    { 
     GenInfo = true; 
    } 
    if (box.ID.StartsWith("EmpInfo_")) 
    { 
     EmpInfo = true; 
    } 
} 

Obviamente se puede hacer de este genérico si usted extrae la expresión lambda de la seconde Dónde llamada. Entonces podrías reutilizarlo para diferentes tipos. Esa es la solución que es lo más cercana posible a su código, pero supongo que sería una mejor idea usar un método recursivo que atraviese la página y darle a ese método sus predicados como expresiones lambda.

+1

Excelente que parece funcionar bien, he añadido una clase, así que no tengo que seguir escribiendo en startsWith ("controlName_") gracias! – Spooks

0

Limpió su código un poco para incluir solo cada cheque una vez.

protected void getEmailGroup() 
    { 
     Control[] allControls = FlattenHierachy(Page); 
     foreach (Control control in allControls) 
     { 
      if (control.ID != null && 
       ((control is TextBox && ((TextBox)control).Text = "") 
        || (control is DropDownList && ((DropDownList)control).SelectedIndex != -1)) 
      { 
       if (control.ID.StartsWith("GenInfo_")) 
        GenInfo = true; 
       if (control.ID.StartsWith("EmpInfo_")) 
        EmpInfo = true; 

      } 
      } 
     } 
    } 
+0

muchas gracias Glennular, lo limpia muy bien – Spooks

+1

¡ah! el control .Text/.SelectedIndex no funciona :(a pesar de que se ve limpio – Spooks

+0

¡Uy, se ha agregado el parens apropiado – Glennular

Cuestiones relacionadas