Получить количество строк в ItemDataBound - PullRequest
1 голос
/ 09 декабря 2011

У меня есть источник данных в Page_Load, связанный с repeater.

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

Как получить доступ к количеству строк источника данных в Page_Load из ItemDataBound повторителя?

Я пробовал:

Dim iCount As Integer
iCount = (reWorkTags.Items.Count - 1)
If e.Item.ItemIndex = iCount Then
    'do for the last row
Else
    'do for all other rows
End If

Но оба e.Item.ItemIndex и iCount одинаковы для каждой строки.

Спасибо за любую помощь.J.

Ответы [ 4 ]

4 голосов
/ 09 декабря 2011

Но e.Item.ItemIndex и iCount одинаковы для каждой строки.

Это потому, что предметы все еще являются обязательными. Количество будет равным +1 от текущего индекса элемента при привязке.

Я думаю, что было бы лучше сделать это после того, как repeater полностью переместится.

Поэтому вы можете добавить следующее к вашему Page_Load:

rep.DataBind()

For each item as repeateritem in rep.items
   if item.ItemIndex = (rep.Items.Count-1)
       'do for the last row
   else
       'do for all other rows
   end if
Next

Примечание: я только что добавил rep.DataBind(), чтобы показать, что его следует запускать после привязки повторителя.

1 голос
/ 29 марта 2015

Это старый вопрос, но у меня недавно была именно такая ситуация. Мне нужно было написать разметку для каждого элемента, кроме последнего.

Я создал личную переменную-член в своем пользовательском классе управления и установил для нее свойство count источника данных, связанного с моим повторителем, и вычел из него 1 Поскольку индекс основан на нуле, значение индекса равно единице отсчета.

private long itemCount {get; задавать; }

В Page_Load или любом другом методе, который вы вызываете DataBind:

            //Get the count of items in the data source. Subtract 1 for 0 based index.
            itemCount = contacts.Count-1;

            this.repContacts.DataSource = contacts;
            this.repContacts.DataBind();

Наконец, в вашем методе привязки

           //If the item index is not = to the item count of the datasource - 1

            if (e.Item.ItemIndex != itemCount)
                Do Something....
1 голос
/ 09 декабря 2011

Старался избегать использования сессий, но в итоге он работал с одним из них.

Я только что создал сеанс с количеством строк и смог получить доступ к нему из ItemDataBound.

Protected Sub reWorkTags_ItemDataBound(sender As Object, e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles reWorkTags.ItemDataBound


    If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then

        Dim rowView As System.Data.DataRowView
        rowView = CType(e.Item.DataItem, System.Data.DataRowView)

        Dim link As New HyperLink
        link.Text = rowView("tag")
        link.NavigateUrl = rowView("tagLink")
        link.ToolTip = "View more " & rowView("tag") & " work samples"

        Dim comma As New LiteralControl
        comma.Text = ", "

        Dim workTags1 As PlaceHolder = CType(e.Item.FindControl("Linkholder"), PlaceHolder)

        If e.Item.ItemIndex = Session("iCount") Then
            workTags1.Controls.Add(link)
        Else
            workTags1.Controls.Add(link)
            workTags1.Controls.Add(comma)
        End If

    End If

End Sub
0 голосов
/ 30 августа 2018

Когда происходит привязка данных, источник данных будет установлен для повторителя.Таким образом, в вашем обработчике ItemDataBound вы можете получить его и сравнить с индексом вашего элемента.Это позволит избежать использования Session или локальных переменных.

var datasource = (ICollection)reWorkTags.DataSource;

if (e.Item.ItemIndex + 1 == datasource.Count)
{
    // Do stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...