web-dev-qa-db-ja.com

C#を使用してASP.NETでリピーターデータソースとしてList <>コレクションを使用するにはどうすればよいですか

私は以下のようなリストコレクションを持っています:

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

Aspxの私のリピーターは以下のようなものです:

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

リピーターデータソースをそのList <>コレクションとして設定し、それを使用して繰り返しラベルを埋めるにはどうすればよいですか?

編集:
Repeater1.DataSource = list;を設定した後にエラーが発生しました
または
その回答のようなリピーターのItem_DataBoundにコードを追加した後

DataBinding: 'FileExplorer.Classes.NewAddedFiles'には、 'FileName'という名前のプロパティが含まれていません。

12
SilverLight

listDataSourceとして設定するだけです。

Repeater1.DataSource = list;

[〜#〜]編集[〜#〜]

実際のプロパティはなく、フィールドを使用しています。データバインディングがそれらを見つけるためには、実際のプロパティを作成する必要があります。

したがって、次のようにクラスを変更します。

public class NewAddedFiles
{
    public string FileName { get; set; }
    public string FilePath { get; set; }
    public DateTime FileCreationDate { get; set; }
}
14
CodingGorilla

ええと、ちょうどどうですか:

Repeater1.DataSource = list;

それは確かに私がしたいことです期待 ...あなたはそれを試しましたか?

同じ値が何度も表示されているのではないかと思います。これは、1つのオブジェクトへの複数の参照をリストに入力しているためです。 NewAddedFileinsideループを作成する必要があります。

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

または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();

ちなみにFilePathに関しては、もっと良いアプローチがあると思います...

4
Jon Skeet

Repeater1.DataSource = リスト;

Repeater1.DataBind();

次に、リピーターのItem_databoundイベントを処理します

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
    }
}
2
Just Me

リストをDatasourceプロパティとして設定するだけです:Repeater1.Datasource = list;

1
Rob

各反復でNewAddedFilesオブジェクトを作成する必要があります。

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

はい...反復ごとにNewAddedFilesを追加してください。ついに上記の人のコメントを見ましたが、ワンアップするのに十分なポイントがありません。

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

そして私のaspxは次のようになります:

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