как найти информацию о каждом элементе внутри повторителя (в событии ItemCommand) - источником данных повторителя является коллекция List <> - PullRequest
2 голосов
/ 12 октября 2011

У меня есть список списков, как показано ниже:

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 всегда пуст, когда я нажимаю на каждую кнопку ссылки внутри повторителя!
я хочу получить FilePath каждой кнопки ссылки внутри повторителя!
Как я могу это сделать ?

спасибо заранее

Ответы [ 4 ]

2 голосов
/ 12 октября 2011

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
2 голосов
/ 12 октября 2011

Из памяти (и усилено поиском в Google), ItemCommand - это одно из событий, которое загружает данные из ViewState. Как только это произойдет, ваши исходные ссылки DataItem больше не будут существовать.

Если вы хотите извлечь значения из этого элемента, как бы громоздко это не звучало, вам нужно добавить 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);
1 голос
/ 12 октября 2011

Я уверен, что у кого-то еще будет лучший ответ, чем у меня, но я могу предложить обходной путь, пока вы ждете этого. Вы можете добавить скрытое поле, содержащее FileName, а затем использовать e.Item.FindControl ("HiddenFieldFileName"), чтобы получить значение.

0 голосов
/ 24 июня 2013

В большинстве случаев нет необходимости в скрытом поле, просто поместите нужное значение данных в свойство 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()

Вам может понадобиться кодировать HTML-код, присвоенный CommandArgument, чтобы он не нарушал HTML-код.

Предполагается, что вы не устанавливаете значение CommandName, как если бы оно было именемметода обработчика событий "lbFile_Click".Вместо этого используйте имя для обозначения предполагаемого результата или действия, в данном случае «Навигация».

...