2010-01-26 5 views
1

J'aime manipuler et comparer beaucoup de dates dans mon répéteur même si je dois travailler plus d'une fois avec la même chose.définir variable dans le répéteur?

Il est un peu moche de lancer partout Eval("MyDate") comme ((DateTime)Eval("MyDate")) pour soustraire 2 datetimes ou de les comparer, même si vous devez le faire plus que dans une opération.

J'ai pensé à sauvegarder tous les evals dans une var au début du répéteur?

DateTime mydt1 = Eval("myDate"); 
DateTime mydt2 = Eval("mydate"); 

Ensuite, il est facile de faire des opérations dans tout le répéteur. J'espère que vous comprenez mon idée. Est-ce possible? J'ai essayé des erreurs courtes mais à chaque fois.

mydt1 - mydt2.... 

Merci et meilleures salutations.

+0

Vous ne pouvez pas faire le calcul dans votre source de données et retourner une nouvelle colonne avec? Cela semblerait le meilleur moyen de séparer l'interface utilisateur de la logique. –

+0

Hmm. Mais il est beaucoup plus facile de faire les opérations avec C#. –

Répondre

3

Vous pourrait appeler une méthode sur le code derrière la page du répéteur en utilisant les DateTimes comme arguments. La logique de casting peut être faite dans le code derrière si l'objectif est de créer une page Aspx plus propre.

Exemple ASPX:

<asp:Repeater ID="Repeater1" runat="server"> 
    <ItemTemplate> 
     <asp:Literal 
      ID="Literal1" 
      runat="server" 
      Text='<%# DateFoo(Eval("myDate1"), Eval("myDate2")) %>' /> 
    </ItemTemplate> 
</asp:Repeater> 

Exemple de code C# derrière:

protected string DateFoo(Object o1, Object o2) 
{ 
    DateTime? dt1 = o1 as DateTime?; 
    DateTime? dt2 = o2 as DateTime?; 

    // Do logic with DateTimes 

    return "string"; 
} 
1

Si vous voulez ajouter plus de logique à votre répéteur, je vous suggère de déplacer la logique de liaison au code derrière:

ASPX:

<asp:Repeater id="myRepeater" runat="server"> 
    <ItemTemplate> 
     <asp:Literal id="myLiteral" runat="server" /> 
    </ItemTemplate> 
</asp:Repater> 

CS:

protected override void OnInit(EventArgs e) 
{ 
    myRepeater.ItemDataBound += myRepeater_ItemDataBound; 
    base.OnInit(e); 
} 

void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    // this method will be invoked once for every item that is data bound 

    // this check makes sure you're not in a header or a footer 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 

     // this is the single item being data bound, for instance, a user, if 
     // the data source is a List<User> 
     User user = (User) e.Item.DataItem; 

     // e.Item is your item, here you can find the controls in your template 

     Literal myLiteral = (Literal) e.Item.FindControl("myLiteral"); 

     myLiteral.Text = user.Username + ", " + user.LastLoginDate.ToShortDateString(); 

     // you can add any amount of logic here 
     // if you need to use it, e.Item.ItemIndex will tell you what index you're at 
    } 
} 
1

Je déteste evals avec passion. Voilà pourquoi j'utiliser ce code pour se débarrasser d'eux pour toujours et revenir à typage fort:

public static class DataItemExtensions 
{ 
     public static T As<T>(this IDataItemContainer repeater) where T : class 
    { 
     return (T)repeater.DataItem; 
    } 

    public static dynamic AsDynamic(this IDataItemContainer repeater) 
    { 
     return repeater.DataItem; 
    } 
} 

utiliser ensuite comme ceci:

<asp:Repeater runat="server" DataSource="<%# this.MyObjectCollection %>"> 
<ItemTemplate> 
    <%# Container.As<MyObject>().DateTime %> 
    </ItemTemplate> 
</asp:Repeater> 

Notez que si vous utilisez la source de données comme je l'ai fait, vous devez utiliser this.DataBind() sur la page.

Questions connexes