Member 13290229 Ответов: 0

ASP ретранслятор сортировка данных


Я не уверен, как и возможно ли это, но у меня есть ретранслятор ASP для отображения некоторых данных. Источник данных упорядочивается в событии Page_Load, как показано ниже...

Protected Overloads Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        If Not (Page.IsPostBack) Then

            'No need to re-load Occasion because it's done in the PreLoad event
            Me.Header.Title = "OCP - " + Occasion.Checklist.name

            pnlStatistics.Visible = Not (Occasion.isClosed)
            pnlClose.Visible = SecurityHelper.HasRole(SecurityMatchOption.AtLeast, SecurityRole.Manager, _relevantTeam) And Not (Occasion.isClosed)

            'initially assume checklist can be closed. any un-signed off task in the item_databound event will disable it.
            btnClose.Enabled = True

            'Fix Issue 63: rptTask.DataSource = _db.vw_tasklists.Where(Function(o) o.occasionId = Occasion.id).ToList()
            rptTask.DataSource = _db.vw_tasklists.Where(Function(o) o.occasionId = Occasion.id).OrderBy(Function(t) t.taskDueDate).ThenBy(Function(t) t.taskDueTime)


Однако в событии ItemDataBound мы пересчитываем taskduedate...

Private Sub rptTask_ItemDataBound(sender As Object, e As RepeaterItemEventArgs) Handles rptTask.ItemDataBound

        ' Get the data relating to this task 'row'
        Dim t = CType(e.Item.DataItem, vw_tasklist)

        If e.Item.ItemType = ListItemType.Header Then
            Dim thDueDate = CType(e.Item.FindControl("thDueDate"), HtmlTableCell)

            thDueDate.Visible = Not (Occasion.isClosed)
        End If

        'securable buttons

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

            ' Dynamically create a span element named TASKnnnn, which will be referenced from
            ' 'child page' links back to this page in order to vertically reposition at the selected task
            Dim span = New HtmlGenericControl("span")
            span.ID = "TASK" & t.taskId
            span.ClientIDMode = ClientIDMode.Static                             ' prevent ASP.NET element ID mangling
            e.Item.FindControl("lblTaskName").Parent.Controls.AddAt(0, span)    ' hook it into the repeater row

            Dim btnSignoff = CType(e.Item.FindControl("btnSignOff"), Button)
            Dim btnComment = CType(e.Item.FindControl("btnComment"), Button)
            Dim btnAmend = CType(e.Item.FindControl("btnAmend"), Button)
            Dim btnView = CType(e.Item.FindControl("btnView"), Button)
            Dim lblSoTime = CType(e.Item.FindControl("lblSOTime"), Label)
            Dim lblDueDate = CType(e.Item.FindControl("lblDueDate"), Label)
            Dim lblTaskId = CType(e.Item.FindControl("lblTaskId"), Label)
            Dim lblTaskName = CType(e.Item.FindControl("lblTaskName"), Label)

            lblTaskId.Text = CType(t.taskId, String)

            lblTaskName.Text = t.taskName

            Dim time = (If(t.taskDueTime Is Nothing, New TimeSpan(0, 23, 59, 59), TimeSpan.Parse(t.taskDueTime)))
            Dim dueDateTime As DateTime = (Occasion.started.Date + time)

            'Setup up due DateTime for Daily Tasks
            Select Case DirectCast(t.taskDayTypeId, helpers.Constants.enDayType)
                Case helpers.Constants.enDayType.Daily
                    lblDueDate.Text = dueDateTime.ToString("dd/MM/yyyy HH:mm")
                    Exit Select
                Case Else
                    'Calculate the actual due date for non-daily tasks
                    Dim calculator = New Calculator()
                    Dim calId = t.taskCalendarId
                    Dim taskMonthDay = "1"
                    If Not t.taskMonthDayId Is Nothing Then
                        taskMonthDay = CType(t.taskMonthDayId, String)
                    End If
                    Dim monthDay = _db.MonthDays.First(Function(m) m.id = CInt(taskMonthDay))
                    Dim calendar As Model.Calendar = Nothing
                    If Not calId is Nothing Then
                        calendar = _db.Calendars.First(Function(x) calId.Value = x.id)
                    End If
                    Dim potDate = calculator.GetActualDueDate(dueDateTime, monthDay.monthDay, t, calendar)
                    dueDateTime = (potDate.Date + time)
                    lblDueDate.Text = dueDateTime.ToString("dd/MM/yyyy HH:mm")
                    Exit Select
            End Select


Поэтому, как только данные отображаются в ретрансляторе, некоторые из "задач" находятся не в правильном порядке, потому что срок выполнения может быть пересчитан на дату, предшествующую его "сроку выполнения", который хранится в базе данных.

Что я уже пробовал:

Мне нужно иметь возможность сортировать данные после повторного расчета срока оплаты. Как это возможно?

Спасибо

F-ES Sitecore

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

0 Ответов