通过中继器迭代

时间:2010-11-18 10:04:21

标签: c# asp.net

有这个转发器......

 <asp:Repeater ID="myRepeater" OnItemCommand="rpt1_ItemCommand" runat="server" OnItemDataBound="rpt1_OnItemDataBound">
     <HeaderTemplate>
         <table width="99%" border="0" cellpadding="0" cellspacing="0">
             <tr class="lgrey">
                <td>Default</td>
             </tr>
     </HeaderTemplate>
     <ItemTemplate>
         <table>
             <tr>
                <td>
                    <asp:LinkButton ID="lnk1" Text="Make Default" CommandName="SetDefault" runat="server" Visible="True" CommandArgument='<%#Eval("UserID") %>' CausesValidation="false"></asp:LinkButton>
                    <asp:Label ID="label1" Text="Yes" runat="server" Visible="False"></asp:Label>
                </td>
             </tr>
     </ItemTemplate>
     <FooterTemplate>
         </table>
     </FooterTemplate>
</asp:Repeater>

我想要的是当用户点击转发器呈现的lsit中的任何“lnk1”链接按钮时, 链接应替换为标签“label1”..即当用户点击“Make Default”链接时,应将其替换 标有“是”的标签

现在,当我点击2个链接按钮时,两个标签都显示“是”,因为我只想显示一个链接按钮 即已被克隆的项目和其余项目应仅显示“默认”链接按钮。

即只有一个项目应显示“是”标签...现在如何遍历转发器项目以仅设置一个项目 默认情况下不是多个??

1 个答案:

答案 0 :(得分:6)

您可以迭代转发器项目集合,

protected void myRepeater_ItemCommand(object sender, RepeaterCommandEventArgs e)
{

    int selectedIndex = e.Item.ItemIndex;
    foreach(RepeaterItem item in myRepeater.Items)
    {
        ((LinkButton)item.FindControl("lnk1")).Visible = (item.ItemIndex != selectedIndex);
        ((Label)item.FindControl("label1")).Visible = (item.ItemIndex == selectedIndex);
    }
}

此选项的优点是:1。数据库没有第二次命中。

或者我将我的逻辑放在ItemDataBound事件中,将单击的链接按钮索引存储在成员变量中,并在命令事件处理程序中调用DataBind。

private int selectedIndex = -1;
//...
protected void myRepeater_ItemCommand(object sender, RepeaterCommandEventArgs e)
    {
        selectedIndex = e.Item.ItemIndex;

        myRepeater.DataSource = MyGetDataMethod();
        myRepeater.DataBind();        

    }

在ItemDataBound处理程序中将当前索引与存储的索引进行比较,如果匹配则显示标签。

protected void myRepeater_ItemDataBound(Object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            if(e.Item.ItemIndex == selectedIndex)
            {
               ((LinkButton)e.Item.FindControl("lnk1")).Visible = false;
               ((Label)e.Item.FindControl("label1")).Visible = true;
            }

        }
    }

第二个选项的缺点是:1。数据库的第二次命中。 2.如果用户单击说第二行,而其他一些用户插入新地址记录,则重新绑定时第2行现在可能会有所不同。此外,如果您没有使用订单,那么可能会在数据库调用之间进行更改,而您存储的selectedIndex也可能会失效。

总而言之,我现在选择了一个选项,我已经考虑过了。