Frage

Dies ist eine ASP.Net 2.0-Webanwendung.Die Artikelvorlage sieht als Referenz so aus:

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

Verwenden Sie dies im Codebehind:

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

Ich produziere das:

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

Was ich brauche, sind die Daten von Field1 und Field4

Ich kann anscheinend nicht auf die Art und Weise an die Daten gelangen, wie ich es beispielsweise mit einer DataList oder einer GridView tun würde, und es scheint mir nicht möglich, bei Google etwas anderes zu finden oder dieses schnell zu nutzen, um das zu tun, was ich will.Die einzige Möglichkeit, die ich sehe, um an die Daten zu gelangen, besteht darin, einen regulären Ausdruck zu verwenden, um sie abzurufen (denn ein Mann nimmt, was er will.Er nimmt alles.Und ich bin ein Mann, nicht wahr?Nicht wahr?).

Bin ich auf dem richtigen Weg (ich suche nicht nach der spezifischen Regex dafür?Fälschung, das könnte eine Folgefrage sein ;) ), oder übersehe ich etwas?


Der Repeater ist in diesem Fall in Stein gemeißelt, sodass ich nicht auf etwas Eleganteres umsteigen kann.Ich habe einmal mit DataLists etwas gemacht, das dem ähnelt, was Alison Zhou vorgeschlagen hat, aber das ist schon einige Zeit her (mehr als zwei Jahre) und ich habe einfach völlig vergessen, es auf diese Weise zu machen.Ja, reden wir davon, etwas Offensichtliches zu übersehen...

Also habe ich getan, was Alison vorgeschlagen hat, und es funktioniert gut.Ich glaube nicht, dass der Ansichtsstatus hier ein Problem darstellt, auch wenn dieser Repeater Dutzende von Zeilen abrufen kann.Ich kann nicht wirklich auf die Frage eingehen, ob man es auf diese Weise macht oder stattdessen verwendet (aber ansonsten scheint mir das eine gute Lösung zu sein).Offensichtlich ist Letzteres weniger ein Viewstate-Footprint, aber ich habe nicht genug Erfahrung, um sagen zu können, wann ein Ansatz einem anderen vorzuziehen wäre, ohne dass ich ein extremes Beispiel vor mir habe.Alison, eine Frage:Warum Literale und keine Etiketten?

Euro Micelli, ich habe versucht, eine erneute Suche in der Datenbank zu vermeiden.Da ich im Vergleich zum Rest der Entwicklungswelt immer noch ein wenig grün bin, gebe ich zu, dass ich nicht unbedingt genau weiß, wie viele Datenbankfahrten „genau richtig“ sind.Hier gäbe es kein Leistungsproblem (ich kenne die Auslastung der App gut genug, um das zu wissen), aber ich nehme an, ich habe versucht, es aus Gewohnheit zu vermeiden, da mein Chef dazu neigt, möglichst wenig Fahrten zu unternehmen.

War es hilfreich?

Lösung

Aus der Spitze von meinem Kopf, können Sie so etwas wie dies versuchen:

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

Dann hinter in Ihrem Code, können Sie jedes Literal-Steuerelement zugreifen, wie folgt:

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

Dies wird zu Ihrem Viewstate hinzufügen, aber es macht es einfach, Ihre Kontrollen zu finden.

Andere Tipps

Da Sie mit tabellarischen Daten arbeiten, würde ich empfehlen die Gridview-Steuerelement. Dann werden Sie in der Lage sein, einzelne Zellen zu gelangen.

Sie können die TDs für Field1 und Field4 auf runat="server" und ihnen IDs zu geben. Dann in dem Code-Behind, rufen Sie die InnerText Eigenschaft für jedes td.

Wenn Sie ein smidge mehr Aufwand bei der Erzeugung leisten können, gehen Sie für Datalist und verwenden Sie die Datakeys-Eigenschaft, die die Datenfelder speichern, die Sie benötigen.

Sie können auch in jeder Ihrer Tabellenzellen verwenden, um Etiketten und der Lage sein, Produkte mit e.Item.FindControl ( „LabelID“) zu verweisen.

Das <% # DataBinder.Eval (...)%> Mechanismus Daten nicht in einer "streng" sense Bindung. Es ist eine One-Way-Technik, um Text an bestimmten Stellen in der Vorlage zu setzen.

Wenn Sie die Daten erhalten, müssen wieder aus, man muss entweder:

  1. Holen Sie es aus den Quelldaten
  2. Füllen Sie den Repeater mit einem anderen Mechanismus

Beachten Sie, dass der Repeater nicht die Datasource zwischen Postbacks nicht speichern, Sie können nicht einfach fragen Sie die Daten später zu geben.

Die erste Methode ist in der Regel einfacher zu arbeiten. Nicht davon ausgehen, dass es zu teuer ist Ihre Daten von der Quelle neu zu erfassen, es sei denn, Sie es sich selbst durch Messung beweisen; es ist in der Regel ziemlich schnell. Das größte Problem bei dieser Technik ist es, wenn die Quelldaten zwischen den Anrufen ändern können.

Für das zweite Verfahren wird eine übliche Technik ist es, ein Literal-Steuerelement zu verwenden. Siehe Alison Zhou 's Beitrag für ein Beispiel wie es geht. Ich in der Regel persönlich bevorzuge die wörtlichen Kontrollen innerhalb des OnItemDataBound zu füllen, anstatt

@peacedog :

Richtig; Alisons Methode ist durchaus akzeptabel.

Der Trick mit den Datenbank-Roundtrips: sie nicht frei sind, natürlich, aber Web-Server sind in der Regel sehr „dicht“ sein (schnell, Low-Latency-Verbindung) auf die Datenbank, während Ihre Benutzer sind wahrscheinlich „weit“ (langsam, hohe Latenz-Verbindung).

Durch die über Cookies Daten zu / von dem Browser gesendet, Viewstate, versteckte Felder oder jeder anderen Methode kann tatsächlich „schlechter“ als es wieder aus der Datenbank zu lesen. Es gibt auch Auswirkungen Sicherheit im Auge zu behalten (kann ein „Übel“ user fälschen die Daten wieder aus dem Browser heraus zu kommen? Wäre es egal, ob sie es tun?).

Aber oft macht es keinen Unterschied in der Leistung machen. Deshalb sollten Sie das tun, was natürlich für Ihr spezielles Problem arbeitet und Sorgen darüber nur , wenn Leistung beginnt eine reale Problem zu sein.

Viel Glück!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top