如何在转发器C#中传递多个选中的复选框值

时间:2013-10-01 17:57:53

标签: c# asp.net visual-studio-2010 repeater

我正在使用Repeater控件在ASPX页面上的HTML表格中显示数据库表格中的数据。还有两个链接按钮ApproveReject,它们与Repeater方法ItemCommand绑定。

每行的第一列都有一个复选框。这将使用户能够选择多行并执行批准和拒绝操作。这是代码:

<asp:Repeater ID="PendingRegRepeater" runat="server" OnItemCommand="PendingRegRepeater_ItemCommand">
                <HeaderTemplate>
                    <table>
                        <thead>
                            <tr>
                                <th>
                                    Select
                                </th>
                                <th>
                                    Customer Name
                                </th>
                                <th>
                                    Space ID
                                </th>
                                <th>
                                    Date
                                </th>
                                <th>
                                    Amount Paid
                                </th>
                                <th>
                                    Pin Code
                                </th>
                                <th>
                                    Payment Method
                                </th>
                                <th>
                                    Action
                                </th>
                            </tr>
                        </thead>
                </HeaderTemplate>
                <ItemTemplate>
                    <tbody>
                        <tr>
                            <td>
                                <asp:CheckBox runat="server" />
                            </td>
                            <td>
                                <%# DataBinder.Eval(Container.DataItem, "CustomerName") %>
                            </td>
                            <td>
                                <%# DataBinder.Eval(Container.DataItem, "SpaceID") %>
                            </td>
                            <td>
                                <%# DataBinder.Eval(Container.DataItem, "TransactionDate") %>
                            </td>
                            <td>
                                <%# DataBinder.Eval(Container.DataItem, "AmountPaid") %>
                            </td>
                            <td>
                                <%# DataBinder.Eval(Container.DataItem, "Pincode") %>
                            </td>
                            <td>
                                <%# DataBinder.Eval(Container.DataItem, "PaymentMethod") %>
                            </td>
                            <td>
                                <asp:LinkButton ID="lnkApprove" CommandName="Approve" CommandArgument='<%# Eval("RRID") %>' Text="Approve" runat="server" ForeColor="Black" Font-Underline="true"></asp:LinkButton>
                                /
                                <asp:LinkButton ID="lnkReject" CommandName="Reject" CommandArgument='<%# Eval("RRID") %>' Text="Reject" runat="server" ForeColor="Black" Font-Underline="true"></asp:LinkButton>
                            </td>
                        </tr>
                    </tbody>
                </ItemTemplate>
                <FooterTemplate>
                    </table>
                </FooterTemplate>
            </asp:Repeater>

但是当用户选择多个复选框并按下“批准”或“拒绝”按钮时,我无法想办法处理。编译器不允许我将Check-box的ID属性设置为动态值<%# Eval("RRID") %>。请建议处理这种情况。感谢。

3 个答案:

答案 0 :(得分:3)

我们将使用您分配给复选框的ID生成复选框的ID。生成的ASP.net将为生成的行中的每个复选框具有唯一ID。

HTML

<asp:CheckBox runat="server" id="checkBoxID" />

代码背后

foreach (RepeaterItem item in PendingRegRepeater.Items)
{
    if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
    {
        var checkBox = (CheckBox)item.FindControl("checkBoxID");
        checkBox.Checked = true;
    }
}

答案 1 :(得分:2)

只需将每个复选框设置为静态IS即可。生成的实际ID对象对于每一行都是唯一的。

然后,您可以遍历所有行并访问每行的复选框:

foreach (RepeaterItem item in repeater.Items)
{
    var checkbox = item.FindControl("checkboxId") as CheckBox;
}

答案 2 :(得分:2)

Greate,很明显我为你做的样品:

<asp:Repeater ID="rptPerson" runat="server" EnableViewState="false">
        <ItemTemplate>
            <asp:CheckBox ID="chCustomer" runat="server" Text='<%#Eval("FirstName") %>' />
            <asp:HiddenField ID="hidden" runat="server" Value='<%#Eval("LastName") %>' />
        </ItemTemplate>
</asp:Repeater>

在您的C#代码中:

protected void btnSubmit_Click(object sender, EventArgs e)
{
    foreach (RepeaterItem item in rptPerson.Items)
    {
        CheckBox c = item.Controls[1] as CheckBox;
        if (c.Checked)
            doSomething((item.Controls[3] as HiddenField).Value);
    }
}

您可以在此方法开始时断点,以检查您的转发器的控制位置。在这个例子中,asp:HiddenField位于第3位,asp:checkBox位于第1位。

我非常!!!建议你创建一个UserControl,它将一行所需的所有元素与所需的属性组合在一起,例如:Checked,ID等......并简单地将该控件放在转发器部分,这样它就能为每一行生成所有需要的东西(包括ID)。