如何在转发器中找到每个项目INFO(在ItemCommand事件中) - 转发器数据源是List<>采集

时间:2011-10-11 20:50:26

标签: c# asp.net events repeater itemcommand

我有一个列表集合如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace FileExplorer.Classes
  {
    public class NewAddedFiles
    {
        public string FileName { get; set; }
        public string FilePath { get; set; }
        public DateTime FileCreationDate { get; set; }
    }
}

    private void GetFilesFromDirectory(string PhysicalPath)
    {
        DirectoryInfo Dir = new DirectoryInfo(PhysicalPath);
        FileInfo[] FileList = Dir.GetFiles("*.*", SearchOption.AllDirectories);
        List<NewAddedFiles> list = new List<NewAddedFiles>();
        foreach (FileInfo FI in FileList)
        {
            NewAddedFiles NewAddedFile = new NewAddedFiles();
            string AbsoluteFilePath = FI.FullName;
            string RelativeFilePath =  string RelativeFilePath = "~/" + (AbsoluteFilePath.Replace(Request.ServerVariables["APPL_PHYSICAL_PATH"], String.Empty)).Replace("\\", "/");
            NewAddedFile.FileName = FI.Name;
            NewAddedFile.FilePath = RelativeFilePath;
            NewAddedFile.FileCreationDate = FI.CreationTime;
            list.Add(NewAddedFile);
        }
        Repeater1.DataSource = list;
        Repeater1.DataBind();
    }

我在aspx中的转发器如下所示:

              <asp:Repeater ID="Repeater1" runat="server" 
                    onitemcommand="Repeater1_ItemCommand">
                    <ItemTemplate>
                        <asp:Image ID="imgArrowIconInsideRepeater" runat="server" ImageUrl="~/Images/Login/ArrowIcon.png" />
                        <asp:LinkButton ID="lbFile" runat="server" CommandName="lbFile_Click" CssClass="lbFileInRepeater"><%# Eval("FileName")%></asp:LinkButton>
                        <br />
                        <asp:Label ID="lblFileCreationDate" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "FileCreationDate", "{0:yyyy/MM/dd - tt h:m:s}") %>'
                            CssClass="lblFileCreationDateInRepeater"></asp:Label>
                        <div class="EmptyDiv">
                        </div>
                    </ItemTemplate>
                </asp:Repeater>

和Item_Command后面的代码中的转发器:

protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{

    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        NewAddedFiles currentItem = (NewAddedFiles)e.Item.DataItem;

        switch (e.CommandName)
        {
            case "lbFile_Click":
                {
                    if (HttpContext.Current.Session["User_ID"] != null)
                    {
                        Response.Redirect("~/HandlerForRepeater.ashx?path=" + currentItem.FilePath);
                    }
                    else
                    {
                        ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", "alert('a');", true);
                    }
                    break;
                }

            default:
                {
                    break;
                }
        }
    }

}

我的问题是currentItem总是为null,当我点击转发器内的每个链接按钮时! 我想获得转发器内每个链接按钮的FilePath!
我怎样才能做到这一点 ?

提前致谢

4 个答案:

答案 0 :(得分:2)

e.Item.DataItem仅在数据绑定事件期间可用。您需要使用其他方法来提取所需的信息。将主键放入隐藏字段,检索该值,然后

尝试类似

的内容
RepeaterItem ri = e.Item;
HiddenField pk = (HiddenField)ri.FindControl("pk");

int FileID = Convert.ToInt32(pk.Value);
// Create a NewAddedFiles object using the File's FileID (or whatever you have) and get the Filepath from that

答案 1 :(得分:2)

从内存中(以及从Google搜索中强化),ItemCommand是从ViewState加载数据的事件之一。一旦发生这种情况,您的原始DataItem引用就不再存在了。

如果你想从那个项中检索值,听起来很笨重,你需要在Repeater ItemTemplate中添加一个HiddenField,如下所示:

<asp:HiddenField ID="filePath" runat="server" Value='<%# DataBinder.Eval(Container.DataItem, "FilePath")' />

然后替换这一行:

Response.Redirect("~/HandlerForRepeater.ashx?path=" + currentItem.FilePath);

这两行:

HiddenField filePath = (HiddenField) e.Item.FindControl("filePath");
Response.Redirect("~/HandlerForRepeater.ashx?path=" + filePath.Value);

答案 2 :(得分:1)

我确信别人会有比我更好的答案,但我可以在你等待的时候提供一个解决方法。您可以添加一个包含FileName的隐藏字段,然后使用e.Item.FindControl(“HiddenFieldFileName”)来获取该值。

答案 3 :(得分:0)

在大多数情况下,不需要隐藏字段,只需将所需的数据值放在按钮的CommandArgument属性中:

<asp:LinkButton ID="lbFile" runat="server" CommandName="lbFile_Click" CommandArgument='<%# Eval("FilePath")%>' CssClass="lbFileInRepeater"><%# Eval("FileName")%></asp:LinkButton>

然后在ItemCommand()事件中检索值:

string filePath = e.CommandArgument.ToString()

您可能需要对分配给CommandArgument的值进行HTML编码,以便它不会破坏HTML。

建议您不要将CommandName值设置为事件处理程序方法“lbFile_Click”的名称。而是使用名称来表示预期的结果或行动,在本例中为“导航”。