代码之家  ›  专栏  ›  技术社区  ›  Laramie

中继器回发动态按钮

  •  0
  • Laramie  · 技术社区  · 14 年前

    我在另一个中继器的项模板中有一个嵌套的中继器控件。我想根据数据值动态地向嵌套中继器中的某些项目添加“删除和更新”按钮,在这种情况下,它们是否与当前用户关联。点击任意一个按钮都应该基于服务器端进行处理,以便更新数据源,重新绑定嵌套中继器,并更新包含两个中继器的更新面板。

    <asp:Repeater ID="rpProCom" runat="server">
        <HeaderTemplate><div class="comment"></HeaderTemplate>
        <ItemTemplate>
            <div class="c-score"><%# Eval("Text") %></div>
            <asp:UpdatePanel ID="upOut" runat="server" ChildrenAsTriggers="true" UpdateMode="Always" >
            <ContentTemplate>
            <asp:Repeater ID="rpVotes" runat="server" DataSource='<%# ((ScoreBoard.Score)Container.DataItem).Votes %>' OnItemDataBound="rpVotes_ItemDataBound">
                <HeaderTemplate><ul></HeaderTemplate>
                <ItemTemplate>
                <li>
                <div class="c-ctrl"><asp:PlaceHolder ID="phD" runat="server" /></div>
                <div class="c-box"><!-- placeholder for more tools --></div>
                <div class="c-i"><div runat="server" ID="imgCom" class='<%# Eval("ImgClass") %>' /></div>
                <div class="c-head">
                    <strong><%# Eval("UserName") %></strong>
                    <br /><%# Eval("Dt")%>
                </div>
                <div class="c-body"><%# Eval("Comment") %></div>
                </li></ItemTemplate><FooterTemplate></ul></FooterTemplate>
            </asp:Repeater>
            </ContentTemplate></asp:UpdatePanel>
        </ItemTemplate> 
        <FooterTemplate></div></FooterTemplate>
    </asp:Repeater>
    

    外部转发器绑定在第_init页

    protected void rpVotes_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {
        if (((Vote)e.Item.DataItem).UserName == user.UserName){
            LinkButton btn = new LinkButton();
            btn.Text = "delete";
            btn.CommandName = "delCom";
            btn.CommandArgument = ((Vote)e.Item.DataItem).ID.ToString();
            btn.Click += new EventHandler(DeleteComment);
            btn.ID = "d" + ((Vote)e.Item.DataItem).ID.ToString();
            //find contrl
            e.Item.FindControl("phD").Controls.Add(btn);
        }
        }
    }
    

    由于该按钮是在项数据绑定上创建的,并且嵌套在另一个控件中,因此我想不出一种合理的方法来将该按钮和该数据项的唯一标识符保持在VIEWSTATE中,以便在pageinit postback上重新创建该按钮以触发该按钮的Click事件。

    我尝试使用命令参数,但它们是空的:

    javascript:__doPostBack('ctl00$CPHRight$rpProCom$ctl02$rpVotes$ctl01$d21','')
    

    我需要一个包含中继器的引用和中继器中项目的唯一标识符,以便我可以更新数据库并重新绑定中继器(理想情况下,在仅包含该中继器的更新面板中)。我知道这是个典型的问题,我相信有人解决了。

    所以,基本上,是否有某种方法可以强制命令参数进入在itemdatabound期间动态创建的动态控件,或者识别哪个动态创建的按钮导致了回发?我可以在中继器中放置和更新面板吗?我也可以用这个词吗 动态地 又在这篇文章里?

    1 回复  |  直到 14 年前
        1
  •  0
  •   Brian Mains    14 年前

    您可以随心所欲地动态使用:-)

    我建议您声明一个静态按钮,添加一个itemdatabound事件,并通过设置按钮的可见属性来显示/隐藏该按钮;这样,您就不必担心重新加载问题,但用户将无法看到他们没有权限访问的按钮。

    Hth.