2016-04-10 5 views
1

Ich versuche, die Ausgabe von einem Repeater zu steuern.Wenn dann noch im Repeater

Ich habe eine schöne Arbeit Repeater aber möchte die Anzeige von cirtain Werte weiter steuern.

Das ist also mein Repeater:

 <asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource_MyList" EnableViewState="False"> 
      <HeaderTemplate> 
       <table border="0" style="margin:0px; border-collapse: collapse; border-spacing: 0px; padding:0px;" class="table table-striped table-hover"> 
       <thead> 
        <tr style="height:35px; font-weight: bold;"> 
        <th style="width:20%" class="toprowcolor">StartNr</th> 
        <th style="width:40%" class="toprowcolor">Name</th> 
        <th style="width:30%" class="toprowcolor">StartDate</th> 
        <th style="width:10%" class="toprowcolor">Group</th> 
       </tr> 
       </thead> 
       <tbody> 
      </HeaderTemplate> 
      <ItemTemplate> 
       <tr style="height:27px;" > 
        <td style="width:20%" class="listtext_s"><asp:Label ID="startnrLabel" runat="server" Text='<%# Eval("startnr") %>' /></td> 
        <td style="width:40%" class="listtext_s"><asp:Label ID="nameLabel" runat="server" Text='<%# Eval("name") %>' /></td> 
        <td style="width:30%" class="listtext_s"><asp:Label ID="startdateLabel" runat="server" Text='<%# Eval("startdate", "{0:g}") %>' /></td> 
        <td style="width:10%" class="listtext_s"><asp:Label ID="groupLabel" runat="server" Text='<%# Eval("group") %>' /></td> 
       </tr> 
      </ItemTemplate> 
      <FooterTemplate> 
      </tbody> 
      </table> 
      </FooterTemplate> 
     </asp:Repeater> 

Ich mag würde, so etwas tun; (Versuchen Sie, mein Ziel in unten Code mit einer Mischung aus Spegetticode (Classic ASP) mit einigen Übersetzungen zu ASP.NET C# zu erklären) Ich hoffe, Sie können es lesen !?

 <asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource_MyList" EnableViewState="False"> 
      <HeaderTemplate> 
       <table border="0" style="margin:0px; border-collapse: collapse; border-spacing: 0px; padding:0px;" class="table table-striped table-hover"> 
       <thead> 
        <tr style="height:35px; font-weight: bold;"> 
        <th style="width:20%" class="toprowcolor">StartNr</th> 
        <th style="width:40%" class="toprowcolor">Name</th> 
        <th style="width:30%" class="toprowcolor">StartDate</th> 
        <th style="width:10%" class="toprowcolor">Group</th> 
       </tr> 
       </thead> 
       <tbody> 
      </HeaderTemplate> 
      <ItemTemplate> 
      <% If Eval("name") == "aron" 
       { 
        If Eval("group") == "1" 
         { namecellcolor = "#454545" } 
        ElseIf Eval("group") == "2" 
         { namecellcolor = "#555555" } 
        ElseIf Eval("group") == "3" 
         { namecellcolor = "#666666" } 
        Else 
         { namecellcolor = "#FFFFFF" } 
       } 
       ElseIf Eval("name") == "bill" 
        { namecellcolor = "#000000" } 
       Else 
        { namecellcolor = "#111111" } 
      %> 

      <% If Eval("startdate", "{0:g}") <= DateTime.Now.Date; AND Eval("group") == "1" OR Eval("startdate", "{0:g}") <= DateTime.Now.Date; AND Eval("group") == "2" 
        { groupcellcolor = "#010101" } 
       elseif Eval("startdate", "{0:g}") <= (DateTime.Now.Date; + 2) AND Eval("group") == "1" OR Eval("startdate", "{0:g}") <= (DateTime.Now.Date; + 2) AND Eval("group") == "2" 
        { groupcellcolor = "#333333" } 
       else 
        { groupcellcolor = "#000000" } 
      %> 
       <tr style="height:27px;" > 
        <td style="width:20%; background-color: <%# namecellcolor %>" class="listtext_s"><asp:Label ID="startnrLabel" runat="server" Text='<%# Eval("startnr") %>' /></td> 
        <td style="width:40%" class="listtext_s"><asp:Label ID="nameLabel" runat="server" Text='<%# Eval("name") %>' /></td> 
        <td style="width:30%" class="listtext_s"><asp:Label ID="startdateLabel" runat="server" Text='<%# Eval("startdate", "{0:g}") %>' /></td> 
        <td style="width:10%; background-color: <%# groupcellcolor %>" class="listtext_s"><asp:Label ID="groupLabel" runat="server" Text='<%# Eval("group") %>' /></td> 
       </tr> 
      </ItemTemplate> 
      <FooterTemplate> 
      </tbody> 
      </table> 
      </FooterTemplate> 
     </asp:Repeater> 

Ihre Antwort:

  1. Wow Geck, unter diesem Stonedge Block von Ihnen zurückkriechen und Mühe Dont zurück zu kommen!
  2. Interessante Reihe von Tippfehler haben Sie dort Champion!
  3. Ich werde versuchen, eine funktionierende Lösung für Ihr Problem zu erklären, und hier geht es;

Also was wird es sein?

Ich schätze wirklich jede Hilfe, die ich bekommen kann.

+0

stets getrennt Stil von Markup und server Code, einfach erstellen Klassen für Ihren Bedarf. –

+0

Warum können Sie den Datensatz nicht ändern, bevor Sie ihn an den Repeater binden? –

+0

Genau, warum kann ich den Datensatz nicht ändern, bevor er an den Repeater gebunden wird? Wenn ich kann, ist die Frage eher wie? – Slint

Antwort

2

Interessante Reihe von Tippfehler Sie haben dort Champion!

Aber ich sehe, was Sie versuchen zu erreichen. Sie müssen grundsätzlich eine Hintergrundfarbe basierend auf den Werten im datengebundenen Objekt auswählen.

Sie können dies theoretisch in der aspx-Datei tun, aber wie Sie sehen können, ist es sehr chaotisch und Sie verlieren schnell den Überblick darüber, was was ist.

Eine bessere Option ist dies im Backend-Code zu tun. Rufen Sie einfach eine Methode in Page auf, um die Farbe zu ermitteln und zurückzugeben, oder verwenden Sie das Ereignis ItemDataBound, um das HTML zu bearbeiten, nachdem es vom Repeater gerendert wurde.

Hier ist, wie Sie die Namenszelle tun.

  1. eine ID zum <td> hinzufügen und machen es runat="server" so der Code-behind darauf zugreifen können.
  2. Erstellen Sie einen ItemDataBound-Ereignishandler für den Repeater.
  3. Im Ereignishandler erhalten Sie Ihr Datenobjekt von e.Item.DataItem und verwenden Sie es, um die Hintergrundfarbe zu erarbeiten. Dies sollte einfacher sein, denn jetzt sind Sie in Code und haben nur ein Objekt (in Ihrem Fall ein DataRow wie Sie SqlDataSource verwenden) anstelle aller Eval() s.
  4. Finden Sie die <td> Kontrolle und stellen Sie es BgColor.

So etwas sollte es tun (nicht getestet, sollte aber nahe genug sein):

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource_MyList" EnableViewState="False" 
    OnItemDataBound="Repeater1_ItemDataBound"> 
    <HeaderTemplate> 
     <table border="0" style="margin:0px; border-collapse: collapse; border-spacing: 0px; padding:0px;" class="table table-striped table-hover"> 
      <thead> 
       <tr style="height:35px; font-weight: bold;"> 
       <th style="width:20%" class="toprowcolor">StartNr</th> 
       <th style="width:40%" class="toprowcolor">Name</th> 
       <th style="width:30%" class="toprowcolor">StartDate</th> 
       <th style="width:10%" class="toprowcolor">Group</th> 
      </tr> 
     </thead> 
     <tbody> 
    </HeaderTemplate> 
    <ItemTemplate> 
     <tr style="height:27px;" > 
      <td runat="server" ID="nameCell" style="width:20%" class="listtext_s"><asp:Label ID="startnrLabel" runat="server" Text='<%# Eval("startnr") %>' /></td> 
      <td style="width:40%" class="listtext_s"><asp:Label ID="nameLabel" runat="server" Text='<%# Eval("name") %>' /></td> 
      <td style="width:30%" class="listtext_s"><asp:Label ID="startdateLabel" runat="server" Text='<%# Eval("startdate", "{0:g}") %>' /></td> 
      <td style="width:10%" class="listtext_s"><asp:Label ID="groupLabel" runat="server" Text='<%# Eval("group") %>' /></td> 
     </tr> 
    </ItemTemplate> 
    <FooterTemplate> 
     </tbody> 
     </table> 
    </FooterTemplate> 
</asp:Repeater> 


public void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    // get the data item bound to this row of the repeater 
    var dataItem = (DataRow)e.Item.DataItem; 

    // do the logic on the raw object instance 
    string namecellcolor; 

    // read the values from the DataRow (may need to cast to a different type, depending om your SQL query). 
    string itemName = (string)dataItem["name"]; 
    int itemGroup = (int)dataItem["group"]; 

    if(itemName == "aron") 
    { 
     if(itemGroup == 1) 
      namecellcolor = "#454545"; 
     else if(itemGroup == 2) 
      namecellcolor = "#555555"; 
     else if(itemGroup == 3) 
      namecellcolor = "#666666"; 
     else 
      namecellcolor = "#FFFFFF"; 
    } 
    else if(itemName == "bill") 
     namecellcolor = "#000000"; 
    else 
     namecellcolor = "#111111"; 

    // get the table cell and set its BgColor. 
    var nameCell = (System.Web.UI.HtmlControls.HtmlTableCell)e.Item.FindControl("nameCell"); 
    nameCell.BgColor = namecellcolor; 
} 
+0

Ich sehe wirklich die Logik darin. Das könnte funktionieren! Eine dumme Frage. var dataItem = (MeineKlasse) e.Item.DataItem; Wo ist MyClass definiert? – Slint

+0

Ich frage, weil ich einen Fehler bekomme Der Typ oder Namespace-Name 'MyClass' konnte nicht gefunden werden (fehlt Ihnen eine Verwendungs-Richtlinie oder eine Assembly-Referenz? Ich habe System.Data; in meinem Codebehind und ich habe <% @ Import Namespace = "System.Data"%> in meinem aspx so was fehlt ich. – Slint

+0

Soery, ersetzen MyClass mit dem Typ des Objekts, das Sie binden.Ich vermute in Ihrem Fall wäre dies DataRow – Rhumborl