Привязать повторитель к списку файлов и / или папок - PullRequest
0 голосов
/ 26 августа 2009

Я хотел бы создать очень простую галерею изображений. Я пытаюсь выяснить, как привязать Repeater к какому-то пользовательскому объекту, который вернул бы список файлов и / или папок. Может ли кто-нибудь указать мне правильное направление?

UPDATE: Вот что у меня есть, пожалуйста, дайте мне знать, если есть лучший способ сделать это

ListView для отображения моих папок

<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 для отображения моих миниатюр

<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>

А вот 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();

   }
}

Ответы [ 2 ]

1 голос
/ 26 августа 2009

Вы можете привязать повторитель к любому списку. В вашем случае список DirectoryInfo может быть релевантным, или, если вам нужны файлы И папки, какой-то пользовательский объект, который содержит оба:

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

...

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

repFoo.DataSource = fsos;
repFoo.DataBind();
0 голосов
/ 15 июля 2013

Вы можете использовать .NET анонимные типы и LINQ, как показано ниже, код из ClipFlair (http://clipflair.codeplex.com) Страница ввода метаданных галереи (предполагается использование выражения System.Linq):

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
  }
}

Приведенный выше фрагмент получает все файлы * .clipflair из папки ~ / activity вашего веб-проекта

Обновление: использование EnumerateFiles (доступно с .NET 4.0) вместо GetFiles, поскольку это более эффективно для запросов LINQ. GetFiles вернет в память целый массив имен файлов, прежде чем LINQ сможет его отфильтровать.

В следующем фрагменте показано, как использовать несколько фильтров (на основе ответа на Можете ли вы вызвать Directory.GetFiles () с несколькими фильтрами? ), которые GetFiles / EnumerateFiles сами не поддерживают:

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
  }
}

Фрагмент ниже показывает, как получить все каталоги из папки / ~ video, а также отфильтровать их, чтобы выбрать только каталоги, которые содержат файл .ism (содержимое Smooth Streaming) с тем же именем, что и каталог (например, 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
  }
}

Приведенные выше примеры взяты из DropDownList, но это та же логика с любым элементом управления ASP.net, который поддерживает привязку данных (обратите внимание, я называю Foldername поле данных во втором фрагменте и имя файла в первом, но можно использовать любое имя, необходимо указать это в разметке):

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