определить переменную в повторителе? - PullRequest
1 голос
/ 26 января 2010

Мне нравится обрабатывать и сравнивать большое количество дат в моем репитере, даже если мне приходится работать более одного раза с одним и тем же.

Немного некрасиво разыгрывать повсюду Eval("MyDate"), как ((DateTime)Eval("MyDate")), чтобы вычесть 2 даты и сравнить их, даже если вам нужно сделать это более чем за одну операцию.

Я думал о сохранении всех evals в var при запуске ретранслятора?

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

после этого легко выполнять любые операции во всем повторителе. Надеюсь, вы понимаете мою идею. Это возможно? Я пробовал коротко, но каждый раз ошибки.

mydt1 - mydt2....

Спасибо и всего наилучшего.

Ответы [ 3 ]

3 голосов
/ 26 января 2010

Вы можете вызвать метод из кода за страницей из повторителя, используя DateTimes в качестве аргументов. Логика приведения может быть реализована в коде, если цель состоит в том, чтобы создать чистую страницу aspx.

Пример ASPX:

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

Пример кода C # позади:

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

    // Do logic with DateTimes

    return "string";
}
1 голос
/ 16 июля 2012

Я ненавижу зло со страстью. Вот почему я использую этот код, чтобы навсегда избавиться от них и вернуться к строгой типизации :

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

Тогда используйте это так:

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

Обратите внимание, что если вы используете источник данных, как я, вам нужно использовать this.DataBind () на странице.

1 голос
/ 26 января 2010

Если вы хотите добавить больше логики к вашему повторителю, я бы посоветовал вам переместить логику привязки в код:

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