2011-10-11 12 views
11

Tengo una colección de listas, como a continuación:¿Cómo puedo utilizar un List <> Colección como un repetidor origen de datos en ASP.NET con C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace FileExplorer.Classes 
{ 
    public class NewAddedFiles 
    { 
     public string FileName; 
     public string FilePath; 
     public DateTime FileCreationDate; 
    } 
} 

private void GetFilesFromDirectory(string PhysicalPath) 
{ 
    DirectoryInfo Dir = new DirectoryInfo(PhysicalPath); 
    FileInfo[] FileList = Dir.GetFiles("*.*", SearchOption.AllDirectories); 
    List<NewAddedFiles> list = new List<NewAddedFiles>(); 
    NewAddedFiles NewAddedFile = new NewAddedFiles(); 
    foreach (FileInfo FI in FileList) 
    { 
     //Response.Write(FI.FullName); 
     //Response.Write("<br />"); 
     string AbsoluteFilePath = FI.FullName; 
     string RelativeFilePath = "~//" + AbsoluteFilePath.Replace(Request.ServerVariables["APPL_PHYSICAL_PATH"], String.Empty); 
     NewAddedFile.FileName = FI.Name; 
     NewAddedFile.FilePath = RelativeFilePath; 
     NewAddedFile.FileCreationDate = FI.CreationTime; 
     list.Add(NewAddedFile); 
    } 
    Repeater1.DataSource = ????????????; 
    Repeater1.DataBind(); 
} 

Mi repetidor en aspx es como más adelante :

<asp:Repeater ID="Repeater1" runat="server"> 
    <ItemTemplate> 
     <asp:Label ID="Label1" runat="server" Text='<%# Eval("FileName") %>'></asp:Label> 
     <br /> 
     <asp:Label ID="Label2" runat="server" Text='<%# Eval("FilePath") %>'></asp:Label> 
     <br /> 
     <asp:Label ID="Label3" runat="server" Text='<%# Eval("FileCreationDate") %>'></asp:Label> 
    </ItemTemplate> 
</asp:Repeater> 

¿Cómo se establecen como fuente de datos repetidor que List <> Recogida y lo utilizan para llenar las etiquetas repetidas?

EDIT: apareció
de error después de establecer Repeater1.DataSource = lista;
o
después de añadir algo de código en Item_DataBound de ese repetidor como la respuesta

DataBinding: 'FileExplorer.Classes.NewAddedFiles' no contiene una propiedad con el nombre 'nombre de archivo'.

Respuesta

13

acaba de establecer su list como el DataSource:

Repeater1.DataSource = list; 

EDITAR

Usted no tiene propiedades reales, que está utilizando campos. Necesita crear propiedades reales para que el enlace de datos las encuentre.

Así modificar su clase como:

public class NewAddedFiles 
{ 
    public string FileName { get; set; } 
    public string FilePath { get; set; } 
    public DateTime FileCreationDate { get; set; } 
} 
+0

Cualquier idea sobre cómo implementarla en mi código, por favor: http://stackoverflow.com/questions/31255119/how-to-populate- two-separate-repeater-with-distinct-column-name-and-the-value-c Gracias. – SearchForKnowledge

4

Um, ¿qué hay de justo:

Repeater1.DataSource = list; 

eso es ciertamente lo que haría esperar ... ¿has probado?

Sospecho que está viendo los mismos valores una y otra vez, eso se debe a que está rellenando su lista con múltiples referencias a un solo objeto. Usted debe crear su NewAddedFiledentro su bucle:

foreach (FileInfo fi in FileList) 
{ 
    NewAddedFiles file = new NewAddedFiles(); 
    string relativeFilePath = "~//" + 
     fi.FullName.Replace(Request.ServerVariables["APPL_PHYSICAL_PATH"], ""); 
    file.FileName = fi.Name; 
    file.FilePath = relativeFilePath; 
    file.FileCreationDate = fi.CreationTime; 
    list.Add(file); 
} 

O usando LINQ:

List<NewAddedFiles> list = FileList.Select(fi => 
    new NewAddedFiles { 
     FileName = fi.Name, 
     FilePath = "~//" + fi.FullName 
        .Replace(Request.ServerVariables["APPL_PHYSICAL_PATH"], ""), 
     FileCreationPath = fi.CreationTime 
    }).ToList(); 

Con respecto a la FilePath por cierto, sospecho que hay mejores enfoques ...

+0

gracias por la respuesta/pero tengo un error/PLZ ver mi nuevo q ... – MoonLight

+0

gracias Bro para la atención a este tema ... si podría marcar ambas respuestas, y @just now, como mi respuesta/ – MoonLight

-1

Simplemente configure la lista como la propiedad Datasource: Repeater1.Datasource = list;

+0

gracias por la respuesta – MoonLight

0

necesita crear un objeto NewAddedFiles en cada iteración:

private void GetFilesFromDirectory(string PhysicalPath) 
{ 
    DirectoryInfo Dir = new DirectoryInfo(PhysicalPath); 
    FileInfo[] FileList = Dir.GetFiles("*.*", SearchOption.AllDirectories); 
    List<NewAddedFiles> list = new List<NewAddedFiles>(); 
     NewAddedFiles NewAddedFileItem = null; 
    foreach (FileInfo FI in FileList) 
    { 
     //you need to create a new object at each iteration 
     NewAddedFileItem = new NewAddedFiles(); 
     //Response.Write(FI.FullName); 
     //Response.Write("<br />"); 
     string AbsoluteFilePath = FI.FullName; 
     string RelativeFilePath = "~//" + AbsoluteFilePath.Replace(Request.ServerVariables["APPL_PHYSICAL_PATH"], String.Empty); 
     NewAddedFileItem.FileName = FI.Name; 
     NewAddedFileItem.FilePath = RelativeFilePath; 
     NewAddedFileItem.FileCreationDate = FI.CreationTime; 
     list.Add(NewAddedFileItem); 
    } 
     Repeater1.DataSource = list; 
     Repeater1.DataBind(); 
} 
+0

gracias por la respuesta/pero tengo un error/por favor vea mi q otra vez ... – MoonLight

+0

He editado mi respuesta –

2

Repeater1.DataSource = list;

Repeater1.DataBind();

Entonces manejar Item_databound caso de repetidor

protected void Repeater_ItemDatabound(object s,EventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item 
     || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     NewAddedFiles currentItem=(NewAddedFiles)e.Item.DataItem; 
     //do ur rocessing here 
    } 
} 
0

SÍ ... Asegúrese de agregar NewAddedFiles para cada iteración. Finalmente vi el comentario de la persona anterior, pero no tengo suficientes puntos para darle una oportunidad.

Mine (that now works for me) in VB (and changed a little bit): 

Dim myList As New List(Of NewAddedFiles)() 

For Each File In Files 

Dim finfo As New System.IO.FileInfo(File) 
Dim ThisFileName As String = finfo.Name 

'Response.Write(FI.FullName); 
'Response.Write("<br />"); 
Dim AbsoluteFilePath As String = finfo.FullName 
Dim RelativeFilePath As String = "~//" + AbsoluteFilePath.Replace(Request.ServerVariables("APPL_PHYSICAL_PATH"), [String].Empty) 
Dim NewAddedFile As New NewAddedFiles() 
       NewAddedFile.FileName = ThisFileName 
       NewAddedFile.FilePath = RelativeFilePath 
       NewAddedFile.FileCreationDate = finfo.CreationTime 
       myList.Add(NewAddedFile) 
Next 

      repeater_contactlist.DataSource = myList 
      repeater_contactlist.DataBind() 

Y mi aspx se parece a esto:

 <asp:Repeater runat="server" ID="repeater_contactlist"> 
      <HeaderTemplate> 
       <table cellspacing="0" cellpadding="0" border="0" class="table_volunteers_contacts_dump"> 
      </HeaderTemplate> 
      <ItemTemplate> 
       <tr> 
        <td align="left"> 
         <tt> 
         <asp:LinkButton ID="lnkbutton_filelink" runat="server" Text='<%# Eval("FileName") %>'></asp:LinkButton></tt> 

        </td> 

       </tr> 
      </ItemTemplate> 
      <FooterTemplate> 
       </table> 
      </FooterTemplate> 
     </asp:Repeater> 
Cuestiones relacionadas