中继器内的多个更新面板触发器

本文关键字:触发器 更新 中继器 | 更新日期: 2023-09-27 18:16:54

我在为重复器内部的项目创建触发器时遇到了一些麻烦。我想一个Linkbutton控件触发从更新面板内的回发,我有一个触发器定义在标记为Button控件工作良好:

<Triggers>
     <asp:PostBackTrigger ControlID="button" />
</Triggers>

然而,我不能为LinkButton s这样做,因为它们是动态创建的,唯一的解决方案是在我的中继器数据绑定事件中为每个按钮添加一个触发器,如下所示:

//Inside repeater itemdatabound...
var trigger = new PostBackTrigger();
trigger.ControlID = linkButton.UniqueID;
updatepanel.Triggers.Add(trigger);

当运行这个代码时,我收到一个错误:

ID为'ctl00$content$repeater$ctl01$linkButton'的控件无法为' UpdatePanel '中的触发器找到。

如何动态地为每个LinkButtons添加触发器?

中继器内的多个更新面板触发器

解决了。我假设它在我的OP中不起作用的原因是因为中继器控件对更新面板不直接可见。

我怀疑将它们移出中继器会解决这个问题,或者对FindControl("linkbutton")调用进行调整以钻入控件的中继器,使用这种方法意味着我需要为每个级别创建两个链接按钮对象,这是不希望的。

然而,我认为更干净的解决方案是使用scriptmanager将LinkButton控件注册为回发控件:

//Create triggers for each 'remove' button
ScriptManager scriptManager = ScriptManager.GetCurrent(Page);
if (scriptManager != null)
{
     scriptManager .RegisterPostBackControl(linkbutton);
}

在中继器OnItemDataBound事件中,解决了它。

我记得可以使用clientID而不是uniqueID属性。

简洁的解决方案是:

    protected void MyRepeater_OnItemCreated(object sender, RepeaterItemEventArgs e)
    {
        //Inside ItemCreatedEvent
        ScriptManager scriptMan = ScriptManager.GetCurrent(this);
        LinkButton btn = e.Item.FindControl("btnSubmit") as LinkButton;
        if (btn != null)
        {
            btn.Click += btnSubmit_Click;
            scriptMan.RegisterAsyncPostBackControl(btn);
        }
    }

这是源线程