2011-10-11 11 views
11

Ho una collezione lista come di seguito:Come posso utilizzare un List <> Collezione come ripetitore DataSource in 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(); 
} 

mio ripetitore in aspx è come qui di seguito :

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

come posso impostare ripetitore origine dati di quella lista <> Raccolta e usarlo per coprire le etichette ripetute?

EDIT:
errore è apparso dopo aver impostato Repeater1.DataSource = lista;
o
dopo l'aggiunta di un po 'di codice Item_DataBound di quel ripetitore come quella risposta

DataBinding: 'FileExplorer.Classes.NewAddedFiles' non contiene una proprietà con il nome di 'FileName'.

risposta

13

Basta impostare la vostra list come DataSource:

Repeater1.DataSource = list; 

EDIT

Non è proprietà effettive, si sta utilizzando campi. È necessario creare proprietà effettive per consentire al database di trovarle.

Quindi modificare la classe come:

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

Qualsiasi idea su come implementarla nel mio codice, per favore: http://stackoverflow.com/questions/31255119/how-to-populate- due ripetitori separati-con-distinto-nome-colonna-e-valore-c Grazie. – SearchForKnowledge

4

Um, che ne dici basta:

Repeater1.DataSource = list; 

Questo è certamente quello che mi aspettano ... hai provato?

Ho il sospetto che tu stia vedendo gli stessi valori ancora e ancora: è perché stai compilando il tuo elenco con più riferimenti a un singolo oggetto. Si dovrebbe essere la creazione di tuo NewAddedFileall'interno il ciclo:

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 utilizzando 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(); 

Per quanto riguarda la FilePath a proposito, ho il sospetto che ci sono approcci migliori ...

+0

grazie per la risposta/ma ho un errore/plz vedere di nuovo il mio q ... – MoonLight

+0

grazie bro per l'attenzione a questa discussione ... se Potrei aver contrassegnato entrambe le tue e @giustamente risponde come risposta/ – MoonLight

-1

Impostare semplicemente l'elenco come proprietà Datasource: Repeater1.Datasource = list;

+0

grazie per la risposta – MoonLight

0

è necessario creare un oggetto NewAddedFiles ad ogni iterazione:

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

grazie per la risposta/ma ho un errore/plz vedere di nuovo il mio q ... – MoonLight

+0

Ho modificato la mia risposta –

2

Repeater1.DataSource = lista;

Repeater1.DataBind();

quindi gestire eventi Item_databound del ripetitore

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

SI ... Assicurati di aggiungere NewAddedFiles per ogni iterazione. Finalmente ho visto il commento della persona sopra, ma non ho abbastanza punti per dargli un one-up.

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

E il mio aspx assomiglia a questo:

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