2009-02-27 9 views
2

Amis,comment récupérer les valeurs de 100 zones de texte en utilisant la boucle

I Have une grille de plus de 100 zones de texte (HTML ou ASP.NET) chacun sera contenant une valeur de texte de longueur fixe, besoin de toutes ces Je peux le faire en passant simplement par chacune des commandes.

Cependant, cela rend le code trop grand et laid.

Je me demandais s'il y a une raison pour laquelle de passer par chaque commande en utilisant une structure de mise en boucle contrôlée et récupérer des données

ie

Private List<string> getdata() 
{ 
    Private List<String> MyList = new List<string>(); 
    foreach (Textbox)control txbControl in ....// don't know what this will be 
    { 
     MyList.Add(txbControl.text); 
    } 
} 

S'il vous plaît noter que toutes ces zones de texte ont étiquette d'identification unique sur la la page-à-dire

<tablr> 
<tbody> 
<tr> 
<td> 
<asp:TextBox ID="TxB_Customize1" runat="server"></asp:TextBox> 
<td/> 
<td> 
<asp:TextBox ID="TxB_Customize2" runat="server"></asp:TextBox> 
<td/> 
<td> 
<asp:TextBox ID="TxB_Customize3" runat="server"></asp:TextBox> 

... ... ...

Désolé de ne pas mentionner cela, les zones de texte sont groupées en colonnes et chaque zone de texte dans une colonne donnée partage un nom similaire, c'est-à-dire "Txb_Customize" dans l'instance donnée. Donc, lors de la récupération des valeurs, j'ai aussi besoin de savoir d'où il vient (peut être l'ID de la zone de texte).

Répondre

1

ou vous pouvez faire quelque chose comme:

int index = 1; 
while ((TextBox tb 
    = FindControl (
     string.Concat ("TxB_Customize", index.ToString ()) as TextBox != null) 
{ 
    MyList.Add (tb.Text); 
    index++; 
} 

Cela pourrait être bon si vous avez réellement d'autres zones de texte aussi bien, ce qui ne fait pas partie de ce tableau de données.

0

Vous pouvez itérer les commandes de conteneurs (avec MyContainer.Controls), si tout ce que vous avez dans il y a des zones de texte, il sera facile, sinon vous pourriez avoir besoin de faire:

foreach (Control myBox in MyContainer.Controls) 
{ 
    TextBox myBox = Control As TextBox 
    if (myBox != null) 
     // Do Stuff 
} 
8

Regardez le Control.Controls propriété.

Vous voudriez quelque chose comme:

foreach (Control control in Controls) 
{ 
    TextBox textBox = control as TextBox; 
    // Ignore non-textboxes 
    if (textBox != null) 
    { 
     list.Add(textBox.Text); 
    } 
} 

Si vous utilisez .NET 3.5, vous pouvez le faire d'une façon plus simple avec LINQ:

return Controls.OfType<TextBox>() 
       .Select(textBox => textBox.Text) 
       .ToList(); 
+0

damn ... la solution linq est venu à l'esprit, après que j'ai posté ... –

+0

Cette solution LINQ ... wow! :) –

1

Vous pouvez le faire en javascript - donnez-leur un nom de classe et rassemblez-les tous dans une collection et bouclez la collection, puis affichez simplement les valeurs en utilisant ajax. JQuery peut être très pratique ici -.

$ ("") yourclassname chaque (function() {index $ (this) .val() // Ce sera la valeur de votre zone de texte })

vous pouvez créer une grande chaîne et analyser du côté serveur ou vous pouvez créer un tableau de valeur name puis l'utiliser à la place

+0

Hey Bharani je ne suis pas si fémilier avec JQuery mais je l'aime parce que j'ai de toute façon une énorme quantité de script java sur la page. pouvez-vous s'il vous plaît expliquer la partie "(index)" dans votre réponse. c'est-à-dire comment je l'obtiens. ou c'est juste un endroit. J'ai compris le repos. Merci –

+0

chaque fonction est comme une boucle for et l'index de la collection itérée est passé en paramètre à la fonction de rappel. Si à l'intérieur du callback vous avez besoin de l'élément DOM réel, vous pouvez l'utiliser ou vous pouvez utiliser $ (this) si vous avez besoin de l'objet jquery. – Bharani

0

Lorsque la logique du code est liée au nom de la zone de texte, la seule solution que je vois est pour réécrire ce code à partir de zéro, puis acheter quelques bons livres de conception pour le programmeur qui a écrit cette merde.

0

Si vous ne voulez pas dépendre des contrôles serveur, vous pouvez utiliser la collection Request.Form.

Cependant, vous devrez utiliser les ids de contrôle pour dire si elle est une zone de texte, en utilisant les ids de la question:

Request.Form.AllKeys.Where(n => n.StartsWith("TxB_Customize")) 
        .Select(n => new[] { n, Request.Form[n] }); 

qui retourne une collection de paires {Id, valeur}.

+0

Ne serait-ce pas l'UniqueID? Dans ce cas, n.StartsWith ne fonctionnerait pas. –

+0

UniqueID: bien sûr. Aurait besoin de quelque chose d'un peu plus sophistiqué pour correspondre aux clés. – Richard

Questions connexes