XamDataGrid GroupByEvaluator Дата Сортировка vb.net

Я пытался реализовать некоторую пользовательскую группировку с помощью Infragistics xamDataGrid (Infragistics3.Wpf.DataPresenter.v9.1.Express) и в значительной степени написал весь код с сайта Infragistics. У меня есть два разных поля даты - Дата исполнения и Дата напоминания - с помощью GroupByEvaluator. Все казалось хорошо, пока я не попытался добавить оба поля в GroupByArea.

Что происходит, так это: вложенные группы полей в соответствии с датой родительского поля, а не группировка родительского поля. Например, когда я перетаскиваю поле "Дата исполнения" (родительское) в GroupBy, оно группирует эти записи по дате исполнения по четырем категориям: "Срок исполнения в следующем году", "Срок исполнения в этом году", "Просрочка" и "Не установлено". Отлично. Но когда я перетаскиваю поле "Дата напоминания" (вложенное) в GroupBy, я обнаруживаю несколько ярлыков с одной и той же группировкой "Дата напоминания", вложенных в "Дата исполнения" Просрочено ".

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

  • Просроченный (срок исполнения)

    • Не установлено (дата напоминания)
    • Этот месяц (дата напоминания)
    • Не установлено (дата напоминания)
    • Старше (Дата напоминания)
    • Не установлено (дата напоминания)
    • так далее....

С каждой последующей вложенной группировкой самая ранняя дата оплаты (значение родительской группировки) равна или превышает наибольшую дату оплаты предыдущей группировки. Похоже, что коллекция "Просрочено" отсортирована по дате исполнения asc, и она перебирает каждую запись и создает новую вложенную группу всякий раз, когда происходит изменение во вложенной метке. Таким образом, после 5 groupByRecords присваивается метка "Этот месяц", когда следующий "Не установлен" groupByRecord всплывает, создается новая вложенная метка вместо того, чтобы продолжать заполнять существующую.

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

Извините, я не могу прикрепить изображение. Надеюсь, я объяснил проблему хорошо.

Заранее спасибо! Код ниже:

 Imports System.Collections.ObjectModel
 Imports Infragistics.Windows.DataPresenter
 Imports System.Windows
 Imports System.Windows.Controls

 Partial Public Class ManageEntities
 Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    Me.InitializeGroupByGrid()
 End Sub

 #Region "CustomGrouping"
       'http://help.infragistics.com/Help/Doc/WPF/2012.2/CLR4.0/html/InfragisticsWPF4.DataPresenter.v12.2~Infragistics.Windows.DataPresenter.IGroupByEvaluator.html 
Private Sub InitializeGroupByGrid()
    For Each f In Me.SelectorGrid.FieldLayouts(0).Fields
        If f.Name = "Form1DueDate" OrElse f.Name = "Form1LastReminderDate" Then
            f.Settings.GroupByEvaluator = New CustomDateTimeEvaluator

            ' group by the data field
            Dim fsd As FieldSortDescription = New FieldSortDescription()
            fsd.Field = f
            fsd.Direction = System.ComponentModel.ListSortDirection.Descending

            Me.SelectorGrid.FieldLayouts(0).SortedFields.Add(fsd)
        End If
    Next
End Sub
 #End Region

End Class

 #Region "CustomDateTimeEvaluator"

 '//20150918 - From infragistics: http://help.infragistics.com/Help/Doc/WPF/2013.1/CLR4.0/html/InfragisticsWPF4.DataPresenter.v13.1~Infragistics.Windows.DataPresenter.IGroupByEvaluator.html
Friend Class CustomDateTimeEvaluator
Implements IGroupByEvaluator

Private Const NotSet As String = "Not Set"
Private Const PastDue As String = "Past Due"
Private Const DueThisYear As String = "Due This Year"
Private Const DueNextYear As String = "Due Next Year"
Private Const RemindThisMonth As String = "This Month"
Private Const RemindLastMonth As String = "Last Month"
Private Const Older As String = "Older"

Dim targetDate As DateTime = Nothing

Public Function DoesGroupContainRecord(ByVal groupByRecord As GroupByRecord, ByVal record As DataRecord) As Boolean Implements IGroupByEvaluator.DoesGroupContainRecord
    Dim cellValue As Object = record.GetCellValue(groupByRecord.GroupByField)
    Dim desc As String = groupByRecord.Description

    ' handle null values specially
    If cellValue Is Nothing Or TypeOf cellValue Is DBNull Then
        Return desc = NotSet
    End If

    ' if the value is not a date time, just group them together
    If TypeOf cellValue Is DateTime = False Then
        Return True
    End If

    Return desc = GetDateLabel(CType(cellValue, DateTime), groupByRecord.GroupByField.Name)
End Function

Public Function GetGroupByValue(ByVal groupByRecord As GroupByRecord, ByVal record As DataRecord) As Object Implements IGroupByEvaluator.GetGroupByValue
    Dim cellValue As Object = record.GetCellValue(groupByRecord.GroupByField)
    Dim desc As String = String.Empty
    Dim targetDate As DateTime = DateTime.MinValue

    If cellValue Is Nothing Or TypeOf cellValue Is DBNull Then
        desc = NotSet
    ElseIf TypeOf cellValue Is DateTime Then
        targetDate = CType(cellValue, DateTime)
        desc = GetDateLabel(targetDate, groupByRecord.GroupByField.Name)
    End If

    groupByRecord.Description = desc
    Return targetDate
End Function

Public ReadOnly Property SortComparer() As System.Collections.IComparer Implements IGroupByEvaluator.SortComparer
    Get
        Return Nothing
    End Get
End Property

Private Function GetDateLabel(ByVal dt As DateTime, ByVal fldName As String) As String
    Dim d As String = NotSet
    Dim comparison As Integer = Nothing
    Dim currentYear As Integer = DatePart(DateInterval.Year, Now)

    '//If no date, return NotSet
    If dt.Ticks = 0 Then
        Return d
    End If

    '//Group by fieldname name
    If fldName.ToLower = "form1duedate" Then
        '//Past Due includes any records where the Form 1 Due Date is less than July 1st of the current year
        Dim cDDate As New DateTime(currentYear, 7, 1)

        comparison = dt.Date.CompareTo(cDDate.Date)

        If comparison = 0 Then
            d = DueThisYear
        ElseIf comparison < 0 Then
            d = PastDue
        ElseIf comparison > 0 Then
            d = DueNextYear
        Else
            d = NotSet
        End If
    ElseIf fldName.ToLower = "form1lastreminderdate" Then
        Dim currentMonth As Integer = DatePart(DateInterval.Month, Now)
        Dim olderThanDate As New DateTime(currentYear, currentMonth - 1, 1)

        If dt.Date.Year = currentYear AndAlso dt.Date.Month = currentMonth Then
            d = RemindThisMonth
        ElseIf dt.Date.Year = currentYear AndAlso dt.Date.Month = currentMonth - 1 Then
            d = RemindLastMonth
        ElseIf dt.Date < olderThanDate Then
            d = Older
        Else
            d = NotSet
        End If
    End If

    Return d
End Function

End Class

#End Region

0 ответов

Другие вопросы по тегам