Я работаю над сортируемым списком с пейджингом данных. У меня нормально работают списки и пейджинг, но я борюсь с сортировкой. Сама сортировка в порядке; Я могу сортировать по определенному столбцу (ASC или DESC), однако у меня возникают проблемы, когда дело доходит до динамической сортировки, когда пользователь может выбрать столбец и время от времени менять направление сортировки.
Моя основная проблема заключается в том, что в настоящее время генерация отсортированных и разбитых на страницы данных запускается как в обработчике событий Form_Load, так и в обработчике событий Listview_Sorting. В идеале, я бы хотел, чтобы заполнение списка было обработано одним способом для (повторной) загрузки формы и при выборе новой страницы данных, и другим способом, когда пользователь нажимает на заголовок столбца (т.е. когда (повторно) сортировка). К сожалению, когда происходит событие сортировки, выполняется код в Form_Load, а затем выполняется код в ListView_Sorting.
Изначально я был просто неэффективен, чтобы подготовиться к скольжению, но теперь часть кода Form_Load не справляется с тем, что я делаю в обработчике событий Sorting.
Итак, мой вопрос ... как мне разделить обработку этих событий на две группы; как запустить один набор кода, когда страница загружается в первый раз и когда данные выгружаются, когда я пытаюсь отсортировать данные?
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'Initilize the Sort Column and Direction
Dim LastColumn As String = If(Session("SortColumn") Is Nothing, "LastWriteTime", Session("SortColumn"))
Dim SortDirection As SqlClient.SortOrder
Dim SortDirections As Dictionary(Of String, SqlClient.SortOrder) = Session("SortDirections")
If SortDirections Is Nothing OrElse Not SortDirections.ContainsKey(LastColumn) Then
SortDirection = SqlClient.SortOrder.Descending
Else
SortDirection = SortDirections(LastColumn)
End If
Call GenerateSortedArray(LastColumn, SortDirection)
End Sub
Private Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
'bind array to ListView
Me.lvwMSGs.DataBind()
End Sub
Private Sub lvwMSGs_ItemCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewCommandEventArgs) Handles lvwMSGs.ItemCommand
Dim file As FileInfo = New FileInfo(e.CommandArgument.ToString) '-- if the file exists on the server
If e.CommandName = "Stream" Then
If file.Exists Then 'set appropriate headers
Response.Clear()
Response.AddHeader("Content-Disposition", "attachment; filename=" & file.Name)
Response.AddHeader("Content-Length", file.Length.ToString())
Response.ContentType = "application/octet-stream"
Response.WriteFile(file.FullName)
Response.End()
Else 'if file does not exist
Response.Write("This file does not exist.")
End If
End If
End Sub
Public Sub lvwMSGs_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewSortEventArgs) Handles lvwMSGs.Sorting
Call GenerateSortedArray(e.SortExpression, SqlClient.SortOrder.Ascending)
End Sub
Private Sub GenerateSortedArray(ByVal SortColumn As String, ByVal DefaultSortDirection As SqlClient.SortOrder)
Dim dirInfo As New DirectoryInfo(Server.MapPath(AppSettings.Item("ContentDir")))
Dim FileArrayList As New ArrayList(dirInfo.GetFiles("*.msg", SearchOption.TopDirectoryOnly))
Dim SortDirections As New Dictionary(Of String, SqlClient.SortOrder)
With FileArrayList
.TrimToSize()
SortDirections = Session("SortDirections")
If Session("SortDirections") Is Nothing OrElse SortDirections.ContainsKey(SortColumn) Then
'Create dictionary, set to default and store in Session variable
If Session("SortDirections") Is Nothing Then
SortDirections = New Dictionary(Of String, SqlClient.SortOrder)
End If
SortDirections(SortColumn) = DefaultSortDirection
Session("SortDirections") = SortDirections
'Sort data according to preferences
.Sort(New FileInfoComparer(SortDirections(SortColumn), SortColumn))
Else
'retrieve previous sort direction
SortDirections(SortColumn) = 1 - SortDirections(SortColumn)
'Sort data according to preferences
.Sort(New FileInfoComparer(SortDirections(SortColumn), SortColumn))
End If
End With
With Me.lvwMSGs
.DataSource = FileArrayList
.ItemPlaceholderID = "ItemPlaceholder"
End With
End Sub