2009-08-26 10 views
0

Ich möchte eine sehr einfache Bildergalerie erstellen. Ich versuche herauszufinden, wie man einen Repeater an irgendeine Art von benutzerdefiniertem Objekt bindet, das eine Liste von Dateien und/oder Ordnern zurückgibt. Kann mir jemand in die richtige Richtung zeigen?Bind Repeater zu einer Liste von Dateien und/oder Ordnern

UPDATE: Hier ist, was ich bisher haben, lassen Sie es mich wissen, ob es einen besseren Weg, um dieses

Listview zu tun, meine Ordner

<asp:ListView ID="lvAlbums" runat="server" DataSourceID="odsDirectories"> 
    <asp:ObjectDataSource ID="odsDirectories" runat="server" SelectMethod="getDirectories" TypeName="FolderClass"> 
     <SelectParameters> 
      <asp:QueryStringParameter DefaultValue="" Name="album" QueryStringField="album" Type="String" /> 
     </SelectParameters> 
    </asp:ObjectDataSource> 

Listview anzuzeigen meine Miniaturbilder anzuzeigen

<asp:ListView ID="lvThumbs" runat="server" DataSourceID="odsFiles"> 
<asp:ObjectDataSource ID="odsFiles" runat="server" SelectMethod="getFiles" TypeName="FolderClass"> 
    <SelectParameters> 
     <asp:QueryStringParameter Type="String" DefaultValue="" Name="album" QueryStringField="album" /> 
    </SelectParameters> 
</asp:ObjectDataSource> 

Und hier ist FolderClass

public class FolderClass 
{ 
    private DataSet dsFolder = new DataSet("ds1"); 

    public static FileInfo[] getFiles(string album) 
    { 
     return new DirectoryInfo(System.Web.HttpContext.Current.Server.MapPath("/albums/" + album)).GetFiles(); 

    } 
    public static DirectoryInfo[] getDirectories(string album) 
    { 
     return new DirectoryInfo(System.Web.HttpContext.Current.Server.MapPath("/albums/" + album)).GetDirectories() 
       .Where(subDir => (subDir.Name) != "thumbs").ToArray(); 

    } 
} 

Antwort

1

Sie können einen Repeater an eine beliebige Liste binden. In Ihrem Fall einer Liste kann Directory die relevant sein, oder wenn Sie Dateien und Ordner, eine Art von benutzerdefinierten Objekt, das beide gilt:

class FileSystemObject 
{ 
    public bool IsDirectory; 
    public string Name; 
} 

... 

List<FileSystemObject> fsos = ...; // populate this in some fashion 

repFoo.DataSource = fsos; 
repFoo.DataBind(); 
+0

Sie haben mich auf den richtigen Weg gebracht, aber kann ich das tun, ohne eine Klasse zu erstellen? Hier ist, was ich habe bisher Öffentliche Klasse FolderClass { privates DataSet dsFolder = neues DataSet ("ds1"); public FolderClass (Zeichenfolgenpfad) {} ​​ public static FileInfo [] getFiles() {return new DirectoryInfo (@ "E: \ Dokumente \ Projekte \ aaa.com \ albums \ Bridal Bqt").GetFiles();} } – PBG

+0

Nicht, wenn Sie Verzeichnisse UND Dateien verarbeiten müssen. Außerdem, vielleicht aktualisieren Sie Ihren Hauptbeitrag, es ist ein bisschen schwer, Code in diesem kleinen Kommentarabschnitt zu lesen :) Auch, wie Sie es geschrieben haben, ist es ziemlich gut gekapselt, also würde ich mich nicht darum kümmern. Schön gemacht. –

+0

Ich habe meinen ursprünglichen Beitrag bearbeitet – PBG

0

können Sie .NET verwenden Anonyme Typen und LINQ wie dem folgenden Code aus ClipFlair (

aktualisieren

private string path = HttpContext.Current.Server.MapPath("~/activity"); 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) //only at page 1st load 
    { 
    listItems.DataSource = 
     Directory.EnumerateFiles(path, "*.clipflair") 
       .Select(f => new { Filename=Path.GetFileName(f) }); 
    listItems.DataBind(); //must call this 
    } 
} 

Die obige snippet alle von ~/Aktivität Ordner Ihres Webprojektes * .clipflair Dateien bekommt: mit EnumerateFiles (http://clipflair.codeplex.com) Galerie Metadaten Eingabeseite (nimmt einen mit System.Linq Klausel) verfügbar seit .NET 4.0) anstelle von GetFiles, da dies mit LINQ-Abfragen effizienter ist. GetFiles würde eine ganze Reihe von Dateinamen im Speicher zurückgeben, bevor LINQ eine Chance hatte, sie zu filtern.

Der folgende Ausschnitt zeigt, wie mehrere Filter verwenden (basierend auf Antwort auf Can you call Directory.GetFiles() with multiple filters?), die GetFiles/EnumerateFiles selbst nicht unterstützen:

private string path = HttpContext.Current.Server.MapPath("~/image"); 
private string filter = "*.png|*.jpg"; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    _listItems = listItems; 

    if (!IsPostBack) 
    { 
    listItems.DataSource = 
     filter.Split('|').SelectMany(
     oneFilter => Directory.EnumerateFiles(path, oneFilter) 
        .Select(f => new { Filename = Path.GetFileName(f) }) 
    ); 

    listItems.DataBind(); //must call this 

    if (Request.QueryString["item"] != null) 
     listItems.SelectedValue = Request.QueryString["item"]; 
          //must do after listItems.DataBind 
    } 
} 

Das Snippet unten zeigt, wie alle Verzeichnisse bekommen von/~ Video-Ordner und filtert sie auch nur Verzeichnisse auswählen, die eine .ism Datei (Smooth Streaming Content) mit dem gleichen Namen wie das Verzeichnis enthalten (zB someVideo/someVideo.ism)

private string path = HttpContext.Current.Server.MapPath("~/video"); 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) //only at page 1st load 
    { 
    listItems.DataSource = 
     Directory.GetDirectories(path) 
     .Where(f => (Directory.EnumerateFiles(f, Path.GetFileName(f) + ".ism").Count() != 0)) 
     .Select(f => new { Foldername = Path.GetFileName(f) }); 
    //when having a full path to a directory don't use Path.GetDirectoryName (gives parent directory), 
    //use Path.GetFileName instead to extract the name of the directory 

    listItems.DataBind(); //must call this 
    } 
} 

die obigen Beispiele aus einer Dropdownlist sind , aber Es ist die gleiche Logik wie bei allen ASP.net-Steuerelementen, die Data Binding unterstützen (Hinweis: Ich nenne Foldername das Datenfeld im zweiten Snippet und Filename im ersten Snippet, aber könnte einen beliebigen Namen verwenden, muss dies im Markup festgelegt werden):

<asp:DropDownList ID="listItems" runat="server" AutoPostBack="True" 
    DataTextField="Foldername" DataValueField="Foldername" 
    OnSelectedIndexChanged="listItems_SelectedIndexChanged" 
    /> 
Verwandte Themen