Динамически загружаемые события ListButton и PostBack - PullRequest
1 голос
/ 05 февраля 2009

Я пытаюсь получить динамически загруженный LinkButton для запуска события обратной передачи, которое я затем обрабатываю.

У меня через Command, CommandName и CommandArgument - что выглядело очень полезным ... Так что я начал возиться с этим, но в настоящее время не может приступить к работе по желанию.

Ссылки отображаются в таблице, созданной на лету, вот код для их генерации:

    // The links are stored in Session since I was told that the objects need to remain intact across requests.
    LinkButton GetEditCardLink(string card)
    {
        if (!IsPostBack)
        {
            TW("Creating Link for Card '" + card + "' and Placing in Session.", true);
            LinkButton link = CreateEditLink(card);
            Business.Session.Set<LinkButton>("LinkedCards_EditLink_" + card, link);
        }
        return Business.Session.Get<LinkButton>("LinkedCards_EditLink_" + card);
    }

    // Here the link itself is created, note the ID and Command details are set.
    LinkButton CreateEditLink(string forCard)
    {
        TW("Setting Up Link for Card: " + forCard, true);
        LinkButton rtn = new LinkButton();
        rtn.ID = "Edit_" + forCard;
        rtn.Text = Resources.Header("EditDetails");
        rtn.CommandName = "Edit";
        rtn.CommandArgument = forCard;
        rtn.Command += new CommandEventHandler(RedirectToEdit);
        rtn.Attributes["style"] = "display: block; text-align:center;";
        return rtn;
    }

    // ... And the delegate I want called on PostBack..
    void RedirectToEdit(object sender, CommandEventArgs e)
    {
        TW("RedirectToEdit Called:\r\nName: " + e.CommandName + "\r\nArgument: " + e.CommandArgument);
    }

Трассировка подтверждает, что LinkButtons загружаются правильно и создаются только один раз, поэтому теоретически все должно быть в порядке, но когда я нажимаю на ссылку, выполняется PostBack, но метод RedirectToEdit не вызывается?

Вся помощь с благодарностью получена! :)

Примечание * * 1023 О, я подумал, что должен упомянуть TW - это просто служебный метод для Trace.Write/Warn:)

Ответы [ 2 ]

1 голос
/ 05 февраля 2009

Когда вы создаете элемент управления, который требует обработки событий, вы должны сделать это достаточно рано в процессе обработки, чтобы обработчик событий был подключен. Переопределите OnInit для страницы, на которой вы создаете таблицу, и переместите туда код создания таблицы. Как предлагает @ScarletGarden, вам также нужно добавить элемент управления, будь то PostBack или нет. Я считаю, что делать это в Page_Load слишком поздно, чтобы событие было обнаружено, если вы добавите туда элемент управления.

Ссылка

0 голосов
/ 05 февраля 2009

Вот мое испытание, и оно сработало:

protected void Page_Load(object sender, EventArgs e)
{
    //if (!IsPostBack)
    //{
        placeHolderAtPage.Controls.Add(CreateEditLink("forCard1"));
    //}
}

LinkButton CreateEditLink(string forCard)
{
    LinkButton rtn = new LinkButton();
    rtn.ID = "Edit_" + forCard;
    rtn.Text = "EditDetails";
    rtn.CommandName = "Edit";
    rtn.CommandArgument = forCard;
    rtn.Command += new CommandEventHandler(RedirectToEdit);
    rtn.Attributes["style"] = "display: block; text-align:center;";
    return rtn;
}

void RedirectToEdit(object sender, CommandEventArgs e)
{
    Response.Write("RedirectToEdit Called:\r\nName: " + e.CommandName + "\r\nArgument: " + e.CommandArgument);
}

Если вы расшифруете строку IsPostBack, RedirectToEdit будет бесполезен. Только обязательные коды могут находиться под IsPostBack контроль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...