2011-10-11 12 views
11

Mam zbiór lista jak poniżej:Jak mogę używać List <> Kolekcja jako Repeater Datasource w ASP.NET 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(); 
} 

Moja repeater w aspx jest jak poniżej :

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

jak mogę ustawić źródło danych jako repeater tej listy <> Kolekcja i używać go do wypełniania powtarzające etykiet?

EDIT:
błąd pojawił się po ustawieniu Repeater1.DataSource = wykazu;
lub
po dodaniu kodu w Item_DataBound tego repeatera jak tej odpowiedzi

DataBinding: „FileExplorer.Classes.NewAddedFiles” nie zawierają właściwość o nazwie „filename”.

Odpowiedz

13

Wystarczy ustawić swój list jak DataSource:

Repeater1.DataSource = list; 

EDIT

Nie masz rzeczywiste Właściwości, używasz pól. Musisz utworzyć rzeczywiste właściwości, aby zestaw danych mógł je znaleźć.

więc zmodyfikować klasę jak:

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

Wszelkich pomysłów, jak wdrożyć go w moim kodem, proszę: http://stackoverflow.com/questions/31255119/how-to-populate- dwa oddzielne wzmacniacze z wyróżniającą się nazwą kolumny i wartością Dziękujemy. – SearchForKnowledge

4

Um, jak o tylko:

Repeater1.DataSource = list; 

To na pewno, czego się spodziewać... ty nie próbowałem?

Podejrzewam, że wciąż widzisz te same wartości - to dlatego, że wypełniasz swoją listę wieloma odniesieniami do pojedynczego obiektu. powinno być tworzenie NewAddedFilewewnątrz swoją pętlę:

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

lub przy użyciu 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(); 

W odniesieniu do FilePath Nawiasem mówiąc, podejrzewam, że są lepsze sposoby ...

+0

dzięki za odpowiedź/ale mam błąd/plz zobaczyć moją q ponownie ... – MoonLight

+0

dzięki bro za uwagi do tego wątku ... jeśli Mogę zaznaczyć zarówno twoje i @just teraz odpowiedzi jako moja odpowiedź/ – MoonLight

-1

Po prostu ustaw listę jako właściwość Datasource: Repeater1.Datasource = list;

+0

dzięki za odpowiedź – MoonLight

0

trzeba utworzyć obiekt NewAddedFiles w każdej iteracji:

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

dzięki za odpowiedź/ale mam błąd/plz zobacz mój q ponownie ... – MoonLight

+0

Edytowałem moją odpowiedź –

2

Repeater1.DataSource = lista;

Repeater1.DataBind();

Następnie uchwyt Item_databound wydarzenie repeater

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

TAK ... upewnij się dodać NewAddedFiles dla każdej iteracji. W końcu zobaczyłem powyższy komentarz osoby, ale nie mam wystarczającej liczby punktów, by to zrobić.

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

A mój aspx wygląda następująco:

 <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> 
Powiązane problemy