【问题标题】:How can I use a List<> Collection as a Repeater Datasource in ASP.NET with C#如何在 C# 中使用 List<> 集合作为 ASP.NET 中的中继器数据源
【发布时间】:2011-12-05 09:00:17
【问题描述】:

我有一个如下的列表集合:

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”的属性。

【问题讨论】:

    标签: c# asp.net collections repeater datasource


    【解决方案1】:

    只需将您的list 设置为DataSource

    Repeater1.DataSource = list;
    

    编辑

    您没有实际的属性,您正在使用字段。您需要创建实际属性才能让数据绑定找到它们。

    所以修改你的类:

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

    【讨论】:

    【解决方案2】:

    嗯,怎么样:

    Repeater1.DataSource = list;
    

    这当然是我期望的...你试过了吗?

    我怀疑您一次又一次地看到相同的值 - 那是因为您在列表中填充了对单个对象的多个引用。你应该在你的循环中创建你的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,我怀疑有更好的方法......

    【讨论】:

    • 感谢兄弟对这个帖子的关注......如果我可以将你和@just now 的答案都标记为我的答案/
    【解决方案3】:

    Repeater1.DataSource = 列表;

    Repeater1.DataBind();

    然后处理repeater的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
        }
    }
    

    【讨论】:

      【解决方案4】:

      只需将列表设置为Datasource 属性:Repeater1.Datasource = list;

      【讨论】:

        【解决方案5】:

        您需要在每次迭代时创建一个 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();
        }
        

        【讨论】:

          【解决方案6】:

          是的...确保为每次迭代添加 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>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-04-03
            • 1970-01-01
            • 2011-10-06
            • 2011-11-27
            • 2016-08-09
            • 1970-01-01
            • 2011-02-08
            相关资源
            最近更新 更多