Repeater Postback中的动态按钮

时间:2010-06-18 18:48:14

标签: c# asp.net viewstate repeater web-controls

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

<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>

外部转发器绑定在Page_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);
    }
    }
}

由于Button是在项目数据绑定上创建的并且嵌套在另一个控件中,我想不出一种合理的方法来持久保存按钮和Viewstate中数据项的唯一标识符,这样我就可以重新创建按钮了在PageInit回发上,以激活按钮的Click事件。

我尝试使用Command Arguments,但它们是空的:

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

我需要对包含Repeater的引用以及转发器中项目的唯一标识符,以便我可以更新数据库并重新绑定Repeater(理想情况下,在包含该Repeater的UpdatePanel中)。我知道这是一个经典问题,我相信有人会解决它。

基本上,是否有一些方法可以将命令参数强制转换为在ItemDataBound期间动态创建的动态控件,或以其他方式识别哪个动态创建的按钮导致回发?我可以在中继器中放置和更新面板吗?我也可以在这篇文章中再次使用动态这个词吗?

1 个答案:

答案 0 :(得分:0)

您可以根据需要动态使用: - )

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

HTH。