代码之家  ›  专栏  ›  技术社区  ›  Rob Cooper

动态加载的ListButton和回发事件

  •  1
  • Rob Cooper  · 技术社区  · 17 年前

    我正在尝试动态加载 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);
        }
    

    trace确认链接按钮加载正确,并且只创建了一次,因此理论上它们应该可以,但是当我单击链接时,会执行回发,但是 RedirectToEdit 没有调用方法?

    感谢您的帮助!:)

    注释

    哦,我想我应该提一下 TW 只是一种实用方法 Trace.Write/Warn :)

    2 回复  |  直到 17 年前
        1
  •  0
  •   Canavar    17 年前

    这是我的审判,它奏效了:

    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行的注释,重定向到编辑将是无用的。 只有绑定代码可以位于 背靠背 控制。

        2
  •  1
  •   tvanfosson    17 年前

    当您创建一个需要事件处理的控件时,您必须在处理过程中尽早完成它,以便事件处理程序连接起来。为正在创建表的页面重写OnInit,并将表创建代码移到那里。正如@scarletgarden建议的那样,您还需要添加控件,不管它是否是回发。我认为在页面加载中进行此操作太晚了,如果在其中添加控件,则无法检测到事件。

    Reference