![](/img/trans.png)
[英]Print property name when using a List<List<>> Collection as a Repeater Datasource in ASP.NET with C#
[英]How can I use a List<> Collection as a Repeater Datasource in ASP.NET with 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();
}
我在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 <> Collection並將其用於填充重復標簽?
編輯:
設置Repeater1.DataSource = list后出現錯誤;
要么
在該轉發器的Item_DataBound中添加一些代碼后,就像那個答案一樣
DataBinding:'FileExplorer.Classes.NewAddedFiles'不包含名為'FileName'的屬性。
只需將list
設置為DataSource
:
Repeater1.DataSource = list;
編輯
你沒有實際的屬性,你正在使用Fields。 您需要創建實際屬性,以便數據綁定找到它們。
所以修改你的類如:
public class NewAddedFiles
{
public string FileName { get; set; }
public string FilePath { get; set; }
public DateTime FileCreationDate { get; set; }
}
嗯,那怎么樣:
Repeater1.DataSource = list;
這當然是我所期待的 ......你試過嗎?
我懷疑你一次又一次地看到相同的值 - 這是因為你用多個對一個對象的引用來填充你的列表。 您應該在循環中創建NewAddedFile
:
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
,我懷疑有更好的方法......
Repeater1.DataSource = list ;
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
}
}
只需將列表設置為Datasource
屬性: Repeater1.Datasource = list;
是的...確認您為每次迭代添加了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>
你需要在每次迭代時創建一個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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.