2010-06-01 7 views
7

Ho un metodo che trova tutti i controlli, scorre attraverso di essi, determina se sono una casella di testo, un elenco a discesa, ecc. Recupera il nome dell'ID e in base al nome dell'ID imposterà una dichiarazione booleana (quindi vorrei sapere se quella sezione del modulo è completa, e invierò una mail ad un certo gruppo di persone) sfortunatamente questo è fatto con troppe dichiarazioni if ​​e mi chiedevo se potevo ottenere un aiuto per rendere questo più gestibileUn modo migliore? Trovare i controlli ASP.NET, trovando il loro 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

Non penso che sia una buona idea usare i caratteri jolly nei nomi di controllo come questo eccetto * forse * quando si sviluppa un controllo personalizzato davvero disordinato attraverso il compositing. –

+0

Sto sviluppando un controllo personalizzato davvero disordinato heh .. Ho bisogno di passare attraverso un modulo, determina se alcuni campi sono stati compilati e in base a ciò determina chi riceverà solo alcune parti del modulo. – Spooks

+0

forse il problema potrebbe essere ripensato e quindi ridisegnato. Vuoi sapere quali porzioni di un modulo sono complete? Stai aggiungendo dinamicamente i controlli al tuo modulo? Cosa definisce una sezione completa di un modulo - l'esistenza di un controllo con id = pippo? – earthling

risposta

0

Invece di usare l'espressione lambda ho creato un metodo che gestisce il controllo per me, e in base al nome del controllo, imposta che la sezione per essere vero

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; 
     } 

qui è un piccolo frammento del mio codice Voglio solo controllare alcuni controlli (per accelerare le cose) e passo attraverso ogni controllo poiché ogni controllo ha un modo diverso per ottenere il valore (textbox userebbe .text dove dropdownlist userebbe .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

se qualcuno può migliorare su questo fammi sapere! funziona bene, proprio come esso per essere efficiente possibile – Spooks

4

Perché non utilizzare solo il metodo Control.FindControl (stringa)?

da: 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

Io di solito uso un findControl l'unica cosa è che ho più di 100 controlli (alcune caselle di testo, alcune radio, qualche elenco a discesa) e I devono passare attraverso di loro per determinare quali hanno valori in esso, e dal determinare a chi saranno inviati. – Spooks

1

E 'difficile capire la logica dietro il codice, ma sono sicuro che può essere scritto più facile. Per esempio è possibile fare qualcosa di simile:

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; 
    } 
} 

Ovviamente si può fare questo generico se si estrae l'espressione lambda dalla seconde Dove chiamata. Quindi potresti riutilizzarlo per diversi tipi. Questa è la soluzione più vicina possibile al tuo codice, ma suppongo che sarebbe una buona idea usare un metodo ricorsivo che attraversi la pagina e dare quel metodo ai tuoi predicati come espressioni lambda.

+1

Eccellente che sembra funzionare bene, ho aggiunto una classe quindi non devo continuare a digitare startWith ("controlName_") grazie! – Spooks

0

Pulito un po 'il codice per includere solo una volta ciascun controllo.

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

grazie mille Glennular, pulisce molto bene – Spooks

+1

ah! il controllo .Text/.SelectedIndex non funziona: (anche se sembra pulito – Spooks

+0

oops, aggiunto il parente appropriato – Glennular

Problemi correlati