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



我有一个列表集合,如下所示:

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 Of repeater后面的代码:

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总是空的,当我点击每一个链接按钮里面的中继器!
我想得到每一个链接按钮在中继器内的FilePath !
我该怎么做呢?

thanks in advance

从内存中(并从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);

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

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

在大多数情况下,不需要隐藏字段,只需将所需的数据值放在按钮的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()

你可能需要对分配给commanddocument的值进行HTML编码,这样它就不会破坏HTML。

建议不要将CommandName值设置为事件处理程序方法"lbFile_Click"的名称。相反,使用名称来指示预期的结果或操作,在本例中为"导航"。

相关内容

  • 没有找到相关文章

最新更新