2009-11-06 3 views
0

Lorsque j'utilise ASP .NET avec un ListView, à un moment donné, je dois parcourir chaque ListViewDataItem et y rechercher tous les éléments de formulaire, puis tirer les valeurs desdits éléments de formulaire.Comment rechercher tous les éléments de formulaire dans un contrôle spécifié dans ASP .NET

ici est une idée générale de ce que je veux faire:

foreach (ListViewDataItem listItem in MyList.Items) { 
    foreach (FormItem formItem in listItem){ 
     //somehow in here i need to find the type of the item (i.e. textbox, dropdown etc)   
     //then i need to pull the value from them 
    } 
} 

Répondre

1

Edité d'inclure la valeur de forme ...

Peut-être quelque chose comme ça?

protected void Page_Load(object sender, EventArgs e) 
    { 
     var allFormControls = new Dictionary<Control, string>(); 
     GetControls(this.Controls, allFormControls); 
    } 

    private static void GetControls(ControlCollection controlCollection, IDictionary<Control, string> allFormControls) 
    { 



     foreach (Control control in controlCollection) 
     { 
      if (control is TextBox) 
       allFormControls.Add(control, ((TextBox) control).Text); 

      GetControls(control.Controls, allFormControls); 
     } 
    } 

a couru contre les éléments suivants:

<asp:Table runat="server"> 
     <asp:TableRow runat="server"> 
      <asp:TableCell runat="server"> 
       <asp:TextBox runat="server">foo 
       </asp:TextBox> 
       <asp:Button runat="server" /> 
       <asp:Table ID="Table1" runat="server"> 
        <asp:TableRow ID="TableRow1" runat="server"> 
         <asp:TableCell ID="TableCell1" runat="server"> 
          <asp:TextBox ID="TextBox1" runat="server">bar 
          </asp:TextBox> 
          <asp:Button ID="Button1" runat="server" /> 
         </asp:TableCell> 
         <asp:TableCell> 
          <asp:Table ID="Table2" runat="server"> 
           <asp:TableRow ID="TableRow2" runat="server"> 
            <asp:TableCell ID="TableCell2" runat="server"> 
             <asp:TextBox ID="TextBox2" runat="server">hello 
             </asp:TextBox> 
             <asp:Button ID="Button2" runat="server" /> 
            </asp:TableCell> 
            <asp:TableCell> 
             <asp:Table ID="Table3" runat="server"> 
              <asp:TableRow ID="TableRow3" runat="server"> 
               <asp:TableCell ID="TableCell3" runat="server"> 
                <asp:TextBox ID="TextBox3" runat="server">world 
                </asp:TextBox> 
                <asp:Button ID="Button3" runat="server" /> 
               </asp:TableCell> 
              </asp:TableRow> 
             </asp:Table> 
            </asp:TableCell> 
           </asp:TableRow> 
          </asp:Table> 
         </asp:TableCell> 
        </asp:TableRow> 
       </asp:Table> 
      </asp:TableCell> 
     </asp:TableRow> 
    </asp:Table> 

Résultat:

allFormControls 
Count = 4 
    [0]: {[System.Web.UI.WebControls.TextBox, foo 
        ]} 
    [1]: {[System.Web.UI.WebControls.TextBox, bar 
           ]} 
    [2]: {[System.Web.UI.WebControls.TextBox, hello 
              ]} 
    [3]: {[System.Web.UI.WebControls.TextBox, world 
                 ]} 
0
Private Sub LoopControls(ByVal cntrl As Control) 
    If cntrl.Controls.Count > 0 Then 
     For Each child As Control In cntrl.Controls 
      LoopControls(child) 
     Next 
    Else 
     If TypeOf cntrl Is Textbox Then 
      Dim txtBox as TextBox = CType(cntrl, TextBox) 
      Dim myVal as String = txtBox.Text 
     End If 
    End If 
End Sub 

EDIT: Désolé au sujet de la VB, mais ce qui est ma langue maternelle et n'ont pas le temps en ce moment pour convertir en C#, vous devrez donc convertir cette routine en C#, mais cela devrait vous donner une idée de la façon de gérer cela. Fondamentalement, vous appelez cette fonction, passant dans le contrôle parent et il serait récursivement boucler tous les contrôles enfants et les enfants qu'ils avaient.

+0

sauf que FormItem n'est pas vraiment un type. J'ai besoin d'un moyen de sortir tous les formitems, quelle que soit la profondeur de l'arbre de contrôle –

+0

désolé à ce sujet, vérifiez ma modification. C'est en VB, mais devrait vous donner l'idée générale. J'espère que cela pourra aider. – jaywon

0

Je pencherais vers quelque chose comme l'exemple suivant.

protected void Page_Load(object sender, EventArgs e) 
{ 
    foreach(var control in GetControls(Controls)) 
    { 
     var textBox = control as TextBox; 
     if (textBox != null) 
     { 
      //textBox.Text; 
      continue; 
     } 

     var dropdown = control as DropDownList; 
     if (dropdown != null) 
     { 
      //dropdown.SelectedValue; 
      continue; 
     } 

     // etc... 
    } 
} 

private static IEnumerable<Control> GetControls(ControlCollection controlCollection) 
{ 
    foreach (Control control in controlCollection) 
    { 
     yield return control; 

     if (control.Controls == null || control.Controls.Count == 0) 
      continue; 

     foreach (var sub in GetControls(control.Controls)) 
     { 
      yield return sub; 
     } 
    } 
} 
Questions connexes