4

我在为中继器内的项目创建触发器时遇到了一些麻烦。我想要一个Linkbutton控件来从更新面板中触发回发,我在标记中定义了一个触发器,该触发器Button可以正常工作:

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

但是,我不能对LinkButtons 执行此操作,因为它们是动态创建的,唯一的解决方案是为我的转发器数据绑定事件中的每个按钮添加一个触发器,如下所示:

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

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

在 UpdatePanel 'updatepanel' 中找不到触发器的 ID 为 'ctl00$content$repeater$ctl01$linkBut​​ton' 的控件。

如何为我的每个动态添加触发器LinkButtons

4

3 回答 3

8

解决了这个问题。我假设它在我的 OP 中不起作用的原因是因为更新面板不能直接看到中继器控件。

我怀疑将它们移到中继器之外会解决它或对FindControl("linkbutton")调用进行调整以深入了解控件的中继器,使用这种方法意味着我需要为每个级别创建两个链接按钮对象,这是不受欢迎的。

但是,我认为更简洁的解决方案是LinkButton使用脚本管理器将控件注册为回发控件:

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

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

于 2013-06-04T11:11:46.777 回答
0

我似乎记得您可以为此使用 clientID 而不是 uniqueID 属性。

于 2013-06-04T10:51:28.803 回答
0

整洁的解决方案是:

    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);
        }
    }

这是源线程

于 2015-04-21T05:07:21.733 回答