首页 新闻 会员 周边

asp.net repeater嵌套控件的问题

0
悬赏园豆:30 [已解决问题] 解决于 2010-06-28 10:01

在repeater中嵌套LinkButton 调用服务端的代码时,使用CodeBehind一点问题都没有

但是将CodeBehind中的代码放到aspx页面中的<script runat=server>标签中时

会出现这样的情况:嵌套在repeater中的LinkButton总是调用不到服务端的方法,页面只是刷新了一下

但是直接放在页面上的LinkButton确可以调用到

<asp:Repeater runat="server" ID="rptParent" 
        onitemdatabound="rptParent_ItemDataBound" >
        <HeaderTemplate>
            <table cellpadding="2" cellspacing="0" border="0" style="width: 95%;" class="tblno">
            <tr>
            <td class="left alter" style="width: 20%; text-align: center;">
                权限名:
            </td>
            <td class="alter">
              &nbsp;&nbsp;子级
            </td>
            </tr>
        </HeaderTemplate>
        <ItemTemplate>
            <tr>
                <td class="left alter" style="width: auto; text-align: left;">
                   
                        <a href="purviewmodify.aspx?pid=<%# ((DataRowView)Container.DataItem)["id"]%>">
                                <%# ((DataRowView)Container.DataItem)["Name"]%></a>
                                &nbsp;&nbsp;
                                         <%--OnClientClick="return confirm('删除根级的话,子级也会一并删除,确定要删除吗?')"--%>
                                <asp:LinkButton runat="server" ID="lkbDel" Text="删除" OnClick="lkb_Click"></asp:LinkButton>
                </td>
                <td class="alter">
                    <asp:Repeater runat="server" ID="rptPurview" >
                        <ItemTemplate>
                                <a href="purviewmodify.aspx?pid=<%# ((DataRowView)Container.DataItem)["id"]%>">
                                <%# ((DataRowView)Container.DataItem)["Name"]%></a>
                                
                                <asp:LinkButton runat="server" ID="Dels" Text="删除" CommandArgument='<%# ((DataRowView)Container.DataItem)["id"]%>'
                                                OnClientClick="return confirm('确定要删除此权限吗?');"
                                                OnClick="lkb_Click"></asp:LinkButton>
                                &nbsp;&nbsp;
                        </ItemTemplate>
                    </asp:Repeater>
                </td>
            </tr>
        </ItemTemplate>
        <FooterTemplate>
            </table>
        </FooterTemplate>
    </asp:Repeater>

<script runat=server>与CodeBehind 有什么不同会导致这个问题哟?

aspx代码

 

<asp:Repeater runat="server" ID="Repeater1">

        <ItemTemplate>

            <%# GetDataItem() %>

            <asp:LinkButton runat="server" ID="LinkButton1" Text="嵌套测试" OnClick="Lkb_Click"></asp:LinkButton><br />

        </ItemTemplate>

    </asp:Repeater>

 

    <asp:LinkButton runat="server" ID="Lkb" Text="页面测试" OnClick="Lkb_Click"></asp:LinkButton>

 

CodeBehind 代码

 

protected void Page_Load(object sender, EventArgs e)

        {

            if (!IsPostBack)

            {

                Binder();

            }

        }

 

        protected void Binder()

        {

            string[] arr = { "a", "b", "c" };

            Repeater1.DataSource = arr;

            Repeater1.DataBind();

        }

 

        protected void Lkb_Click(object sender, EventArgs e)

        {

            this.Response.Write("测试成功"+DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));

        }

 

 

 

 

後生哥哥的主页 後生哥哥 | 初学一级 | 园豆:23
提问于:2010-06-25 15:31
< >
分享
最佳答案
0

默认来说,如果在repeater里面触发的事件都会被Repeater.ItemCommand给接收到,所以导致了你的linkbutton不触发,你可以为Repeater添加ItemCommand事件设个断点就可以看到效果了

收获园豆:25
kyo-yo | 大侠五级 |园豆:5587 | 2010-06-26 19:03
谢谢你的回答,从的的答案中得到了一些思路,在网络上找了下, 原因应该是这个 page_load事件中绑定数据时没有加 if(!isPostBack) ,这样会导致每次刷新都产生新的控件而非原来的控件,所以不会触发。 但是很奇怪,使用CodeBehind 是没有这个问题的,只有把代码放到aspx页面中的script runat=server标签中时才会出现不能触发方法的问题!
後生哥哥 | 园豆:23 (初学一级) | 2010-06-28 09:31
其他回答(1)
0

看一下MSDN中关于Repeater.ItemCommand的介绍吧

收获园豆:5
chameleon | 园豆:311 (菜鸟二级) | 2010-06-25 16:00
谢谢你的回答
支持(0) 反对(0) 後生哥哥 | 园豆:23 (初学一级) | 2010-06-28 10:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册