2010-08-02 6 views
2

J'ai une page qui répertorie tous les fichiers dans un dossier particulier (tous les PDF), en utilisant une table de données et une grille.Trier datatable/Dataview/Gridview de fichiers basés sur le fichier Date de modification

Je suis actuellement trier cette table par le nom de fichier (en utilisant une vue de données), ce qui n'est pas utile, et je veux la grille de fichiers triés par le fichier créé ou date de modification du fichier (tel que enregistré dans Windows).

Si cela est impossible, une seconde option serait d'extraire la date de la chaîne de nom de fichier (pas de problème le faire), et trier les dataview/datatable ou gridview basé sur cette. Exemple Nom de fichier: DailySalesReport-1-15-2010. Mon seul blocage avec ceci est comment je trier sur la date, quand c'est une valeur de chaîne? Convertir à ce jour? Comment trier l'ensemble de données en fonction de cette valeur convertie?

Merci pour vos idées!

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

Veuillez poster votre contrôle Gridview. Utilisez-vous des champs générés automatiquement? –

+0

oui. ajoutée. Merci! – Albert

Répondre

2

Essayez cette nouvelle page de chargement. Avec une colonne "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 

Pour afficher uniquement la colonne souhaitée, utilisez-la comme 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

J'espérais éviter d'ajouter une autre colonne pour la date, car la date est déjà incluse dans le nom de fichier, sur lequel l'utilisateur clique pour ouvrir le fichier. Le pire des cas, ça va faire quand même. Merci! – Albert

+0

@Albert Vous pouvez inclure une autre colonne dans la source de données sans l'afficher. Utilisez simplement BoundFields et désactivez AutoGenerateColumns sur la grille. –

+0

@Albert Si vous ne voulez pas voir la colonne, créez un et définissez AutoGenerateColumns = "false" dans la vue quadrillée. (Voir édition). –

0

seulement pour être complet - je recommande d'utiliser un Datatable/Dataview avec un (en) date colonne visible comme réponse Carters. Mais vous pouvez également utiliser une collection comme source de données pour votre grille avec des objets personnalisés et Comparer. J'ai créé un petit échantillon pour préciser ce que je veux dire:

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 

Dans cet exemple que la propriété Texte (nom et date) de FileDate sera présentée comme colonne dans la grille parce que son la seule propriété publique dans FileDate . L'aspx-Page contient seulement un GridView vide.

Questions connexes