2010-08-02 2 views
2

У меня есть страница, в которой перечислены все файлы в определенной папке (все файлы PDF) с использованием таблицы данных и gridview.Сортировка Datatable/Dataview/Gridview файлов на основе измененного файла Дата

Я сейчас сортирую эту таблицу по имени файла (с помощью dataview), что не так полезно, и Я хочу, чтобы gridview файлов отсортирован по файлу, созданному или измененному датой файла (как записано в Windows).

Если это не возможно, второй вариант был бы извлечь дату из строки имени файла (без проблем делать это), и отсортировать DataView/DataTable или GridView на основе этой. Пример Имя файла: DailySalesReport-1-15-2010. Мое единственное зависание с этим - как я сортирую по дате, когда это строковое значение? Преобразовать на сегодняшний день? Как мне отсортировать весь набор данных на основе этого преобразованного значения?

Спасибо за любые идеи!

Protected Sub PageLoad(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    If Not IsPostBack Then 
     Dim dt As New DataTable() 
     dt.Columns.Add("Daily Reports", Type.[GetType]("System.String")) 

     For Each name As [String] In System.IO.Directory.GetFiles(Server.MapPath("~\reports\pdf\")) '" 
       dt.Rows.Add(New Object() {name}) 
     Next 

     Dim dv As DataView = dt.DefaultView 
     dv.Sort = dt.Columns(0).ToString + " " + "desc" 
     dt = dv.ToTable 

     Me.gvDaily.DataSource = dt 
     Me.gvDaily.DataBind() 

    End If 
End Sub 



Protected Sub gvDaily_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) 

    If e.Row.RowType = DataControlRowType.DataRow Then 
     Dim hl As New HyperLink() 
     hl.NavigateUrl = "~\reports\pdfs\" + e.Row.Cells(0).Text '" 
     hl.Text = "Daily Report" 
     e.Row.Cells(0).Text = "" 
     e.Row.Cells(0).Controls.Add(hl) 
    End If 

End Sub 


<asp:GridView ID="gvDaily" runat="server" Height="80px" Width = "180px" CssClass="tableText"  
      OnRowDataBound="gvDaily_RowDataBound"> 
      <RowStyle HorizontalAlign="center" />     
</asp:GridView> 
+1

Пожалуйста, отправьте вам управление Gridview. Используете ли вы поля Auto Generated? –

+0

да. добавлено. благодаря! – Albert

ответ

2

Попробуйте загрузить эту новую страницу. С столбцом «FileDate».

Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If Not IsPostBack Then 
     Dim dt As New Data.DataTable() 
     dt.Columns.Add("Daily Reports", Type.[GetType]("System.String")) 
     dt.Columns.Add("FileDate", GetType(System.DateTime)) 

     For Each name As [String] In System.IO.Directory.GetFiles(Server.MapPath("~\reports\pdf\")) 

      Dim fi As New System.IO.FileInfo(name) 

      dt.Rows.Add(New Object() {name, fi.LastWriteTime}) 
     Next 

     Dim dv As DataView = dt.DefaultView 
     dv.Sort = dt.Columns("FileDate").ColumnName & " " & "desc" 
     dt = dv.ToTable 

     Me.gvDaily.DataSource = dt 
     Me.gvDaily.DataBind() 

    End If 
End Sub 

Чтобы показать только тот колонтитул, который вы хотите, используйте это как свой Gridview.

<asp:GridView ID="gvDaily" runat="server" Height="80px" Width = "180px" CssClass="tableText"  
      OnRowDataBound="gvDaily_RowDataBound" AutoGenerateColumns="false"> 
      <RowStyle HorizontalAlign="center" /> 
    <Columns> 
     <asp:BoundField DataField="Daily Reports" HeaderText="Daily Report" /> 
    </Columns>    
</asp:GridView> 
+0

Я надеялся избежать добавления другого столбца для даты, потому что дата уже включена в имя файла, на который пользователь нажимает, чтобы открыть файл. В худшем случае это будет сделано. Благодаря! – Albert

+0

@Albert Вы можете включить другой столбец как часть источника данных, не отображая его. Просто используйте BoundFields и отключите AutoGenerateColumns на Grid. –

+0

@Albert Если вы не хотите видеть столбец, вы должны создать и установить AutoGenerateColumns = "false" в gridview. (См. Править). –

0

только для полноты картины - я бы рекомендовал использовать DataTable/DataView с (в) видимой дата-колонке, как Carters ответ. Но вы также можете использовать Collection в качестве источника данных для вашей сетки с пользовательскими объектами и Comparer. Я создал небольшой образец, чтобы понять, что я имею в виду:

Partial Public Class WebForm1 
    Inherits System.Web.UI.Page 

    Private Sub WebForm1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     If Not IsPostBack Then 
      BindData() 
     End If 
    End Sub 

    Private Sub BindData() 
     Dim usCulture As New Imports System.GlobalizationCultureInfo("en-US") 
     System.Threading.Thread.CurrentThread.CurrentCulture = usCulture 
     Dim nextDate As Date = New Date(2010, 1, 15) 
     Dim files As New List(Of FileDate) 
     Dim rnd As New Random(Date.Now.Millisecond) 
     For i As Int32 = 1 To 100 
      Dim fileName As String = "DailySalesReport" & i 
      files.Add(New FileDate(fileName, nextDate)) 
      nextDate = nextDate.AddDays(rnd.Next(-10, 10)) 
     Next 
     files.Sort(New FileComparer(SortDirection.Descending)) 
     Me.GridView1.DataSource = files 
     Me.GridView1.DataBind() 
    End Sub 
End Class 

Class FileDate 
    Public FileName As String 
    Public FileDate As Date 

    Public Sub New(ByVal FileName As String, ByVal FileDate As Date) 
     Me.FileName = FileName 
     Me.FileDate = FileDate 
    End Sub 

    Public ReadOnly Property Text() As String 
     Get 
      Return Me.ToString 
     End Get 
    End Property 

    Public Overrides Function ToString() As String 
     Return FileName & "-" & FileDate.ToShortDateString 
    End Function 
End Class 

Class FileComparer 
    Implements IComparer(Of FileDate) 

    Public Direction As SortDirection 

    Public Sub New(ByVal direction As SortDirection) 
     Me.Direction = direction 
    End Sub 

    Public Function Compare(ByVal x As FileDate, ByVal y As FileDate) As Integer Implements System.Collections.Generic.IComparer(Of FileDate).Compare 
     If x Is Nothing Then 
      If y Is Nothing Then 
       Return 0 
      Else 
       Return -1 
      End If 
     Else 
      If y Is Nothing Then 
       Return 1 
      Else 
       If Me.Direction = SortDirection.Ascending Then 
        Return x.FileDate.CompareTo(y.FileDate) 
       Else 
        Return y.FileDate.CompareTo(x.FileDate) 
       End If 
      End If 
     End If 
    End Function 
End Class 

В этом примере только текст свойства (имя файла и дата) FILEDATE будет показано в колонке в сетке, потому что его единственная публичная собственность в FILEDATE , Aspx-Страница содержит только пустой GridView.

Смежные вопросы