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