Question

C'est un ASP.Net 2.0 web app.Le modèle d'Élément ressemble à ça, pour référence:

<ItemTemplate>
  <tr>
    <td class="class1" align=center><a href='url'><img src="img.gif"></a></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field1") %></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field2") %></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field3") %></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field4") %></td>
  </tr>
</ItemTemplate>

L'utilisation de ce dans le code-behind:

foreach (RepeaterItem item in rptrFollowupSummary.Items)
{
    string val = ((DataBoundLiteralControl)item.Controls[0]).Text;
    Trace.Write(val);
}

Je produis ce:

<tr>
  <td class="class1" align=center><a href='url'><img src="img.gif"></a></td>
  <td class="class1">23</td>
  <td class="class1">1/1/2000</td>
  <td class="class1">-2</td>
  <td class="class1">11</td>
</tr>

Ce dont j'ai besoin, ce sont les données Champ1 et Field4

Je n'arrive pas à obtenir les données de la façon dont je voudrais en dire un DataList ou un GridView, et je n'arrive pas à trouver quoi que ce soit d'autre sur Google ou rapidement tirer parti de celui-ci pour faire ce que je veux.La seule façon que je peux voir pour obtenir les données à l'aide d'une regex pour aller chercher, il (Parce qu'un homme prend ce qu'il veut.Il prend tout.Et je suis un homme, n'est-ce pas?Ne suis-je pas?).

Suis-je sur la bonne piste (pas de recherche spécifique pour les regex pour ce faire;forgeant que pourrait être une réponse à la question ;) ), ou ai-je raté quelque chose?


Le Répéteur dans ce cas est définie dans la pierre, donc je ne peux pas passer à quelque chose de plus élégant.Une fois, j'ai fait quelque chose de similaire à ce que Alison Zhou a suggéré d'utiliser DataLists, mais il a été un certain temps (+de 2 ans) et j'ai complètement oublié de le faire de cette façon.Yeesh, parler donnant sur quelque chose d'évident...

Donc je n'ai qu'Alison a suggéré et il fonctionne très bien.Je ne pense pas que le viewstate est un problème ici, même si ce répéteur peut obtenir des dizaines de lignes.Je ne peux pas vraiment parler de la question de savoir si faire de cette façon plutôt que d'utiliser la place (mais qui semble comme une bonne solution pour moi sinon).Évidemment, le dernier point n'est pas un état d'affichage de l'empreinte, mais je ne suis pas assez expérimenté pour dire quand on approche peut être préférable à l'autre, sans un exemple extrême en face de moi.Alison, une question:pourquoi littéraux et pas d'étiquettes?

Euro Micelli, j'essayais d'éviter un aller-retour à la base de données.Depuis je suis toujours un peu de vert par rapport au reste du monde du développement, je l'avoue, je n'ai pas forcément une bonne compréhension de la façon dont de nombreux voyages de base de données est "juste".Il n'y aurait pas un problème de performance ici (je sais que l'application de la charge assez pour savoir ce), mais je suppose que j'essayais d'éviter de sortir de l'habitude, depuis mon patron tend à souligner que moins de déplacements possibles.

Était-ce utile?

La solution

Sur le dessus de ma tête, vous pouvez essayer quelque chose comme ceci:

<ItemTemplate>
  <tr>
    <td "class1"><asp:Literal ID="litField1" runat="server" Text='<%# Bind("Field1") %>'/></td>
    <td "class1"><asp:Literal ID="litField2" runat="server" Text='<%# Bind("Field2") %>'/></td>
    <td "class1"><asp:Literal ID="litField3" runat="server" Text='<%# Bind("Field3") %>'/></td>
    <td "class1"><asp:Literal ID="litField4" runat="server" Text='<%# Bind("Field4") %>'/></td>
  </tr>
</ItemTemplate>

Puis, dans votre code derrière, vous pouvez accéder à chaque Littéral de contrôle comme suit:

foreach (RepeaterItem item in rptrFollowupSummary.Items)
{   
    Literal lit1 = (Literal)item.FindControl("litField1");
    string value1 = lit1.Text;
    Literal lit4 = (Literal)item.FindControl("litField4");
    string value4 = lit4.Text;
}

Cela va ajouter à votre ViewState, mais il le rend facile de trouver vos commandes.

Autres conseils

Puisque vous travaillez avec des données tabulaires, je vous recommande d'utiliser le contrôle GridView.Ensuite, vous serez en mesure d'accéder à des cellules individuelles.

Sinon, vous pouvez définir le td est de Champ1 et Field4 à runat="server" et de leur donner des ID.Puis dans le code-behind, accès à la InnerText propriété pour chaque td.

Si vous pouvez vous permettre imposer un brin plus généraux dans la génération, rendez-vous pour DataList et l'utilisation de la DataKeys de la propriété, ce qui permettra d'économiser les champs de données dont vous avez besoin.

Vous pouvez également utiliser des étiquettes dans chacune de vos cellules de tableau et être en mesure de faire référence à des éléments avec e.De l'élément.FindControl("LabelID").

L' <%#DataBinder.Eval(...) %> mécanisme n'est pas la Liaison de Données dans une "stricte" de sens.C'est un moyen technique pour mettre du texte dans des endroits spécifiques dans le modèle.

Si vous avez besoin de récupérer les données, vous devez soit:

  1. L'obtenir à partir de votre source de données
  2. Remplir le relais avec un autre mécanisme

Notez que le Répéteur ne pas enregistrer la source de données entre les publications, Vous ne pouvez pas lui demander de vous donner les données plus tard.

La première méthode est généralement plus facile de travailler avec.Ne présumez pas qu'il est trop coûteux de récupérer vos données à partir de la source, sauf si vous le prouver à vous-même par la mesure;il est généralement assez rapide.Le plus gros problème avec cette technique est que si la source de données peut changer entre les appels.

Pour la deuxième méthode, une technique courante consiste à utiliser un Littéral de contrôle.Voir Alison Zhouaprès pour un exemple de comment le faire.D'habitude je préfère personnellement pour remplir le Littéral de contrôle à l'intérieur de la OnItemDataBound au lieu

@peacedog:

Correct;Alison méthode est parfaitement acceptable.

Le truc avec la base de données des allers-retours:ils ne sont pas libres, évidemment, mais les serveurs web ont tendance à être très "proche" (rapide, à faible latence de la connexion) à la base de données, tandis que vos utilisateurs sont probablement de "loin" (lent, connexion à latence élevée).

À cause de cela, l'envoi de données vers/à partir du navigateur par l'intermédiaire de cookies, de ViewState, champs cachés ou toute autre méthode peut effectivement être "pire" que la lecture de nouveau à partir de votre base de données.Il y a aussi des implications en matière de sécurité à garder à l'esprit (un "mal" utilisateur fausse les données de retour à partir du navigateur?Serait-il question s'ils le font?).

Mais très souvent, il ne fait aucune différence dans la performance.C'est pourquoi vous devriez faire ce qui fonctionne le plus naturellement à votre problème particulier et vous soucier il ne si la performance commence à être dans le monde réel problème.

Bonne chance!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top