c# - 单击按钮时遍历 gridview 行

标签 c# asp.net gridview

我有一个 gridview,用户可以使用复选框选择项目。在页面底部,我有一个保存按钮,我想循环访问 gridview 行并传递所选行的 LinkID。当我去迭代时,我的 gridview.rows 返回 0 但那里有行......我做错了什么?谢谢

<asp:UpdatePanel ID="upPanResults" runat="server">
        <ContentTemplate>
            <div id="divResults" style="min-height: 350px;">
                <asp:GridView ID="grdInvoice" ClientIDMode="Static" runat="server" CssClass="DG"
                    Width="100%" DataKeyNames="LinkID" AutoGenerateColumns="False" GridLines="Vertical"
                    CellPadding="4" AllowPaging="True" AllowCustomPaging="True" PageSize="1000" PagerStyle-Visible="False"
                    ShowFooter="true" RowStyle-CssClass="Item" AlternatingRowStyle-CssClass="Alternating"
                    HeaderStyle-CssClass="HomeDGhead" SelectedRowStyle-CssClass="Selected"
                    OnRowDataBound="grdInvoice_RowDataBound">
                    <Columns>
                        <asp:TemplateField HeaderText="Address">
                            <ItemTemplate>
                                <asp:Label ID="Address" CssClass="norm" runat="server"><%# DataBinder.Eval(Container, "DataItem.Address") %></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="Date">
                            <ItemTemplate>
                                <asp:Label ID="Date" CssClass="norm" runat="server"><%# DataBinder.Eval(Container, "DataItem.Date") %></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="Total">
                            <ItemTemplate>
                                <asp:Label runat="server" ID="LblAmount" CssClass="no_border" Text='<%# DataBinder.Eval(Container, "DataItem.Amount") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField>
                            <ItemTemplate>
                                <asp:CheckBox ID="ChkSelect" runat="server" />
                            </ItemTemplate>
                        </asp:TemplateField>
                    </Columns>
                </asp:GridView>
            </div>
            <table width="98%">
                <tr height="25">
                    <td align="left">
                        <asp:Label ID="Label1" runat="server" CssClass="head2" Text="Approval Number:" ClientIDMode="Static"></asp:Label>&nbsp;&nbsp;<asp:TextBox
                            ID="Txt" runat="server" CssClass="norm" ClientIDMode="Static"></asp:TextBox>
                    </td>
                    <td align="right">
                        <asp:Label ID="Label3" runat="server" CssClass="head2" Text="Selected Total:"></asp:Label>
                        &nbsp;&nbsp;
                        <asp:Label ID="LblTotal" runat="server" ClientIDMode="Static" CssClass="head2" Text="0"></asp:Label>
                    </td>
                </tr>
                <tr height="25">
                    <td align="center" colspan="2">
                        <asp:Button ID="BtnSave" runat="server" CssClass="btn" 
                            Text="Save" OnClick="BtnSave_Click" />
                        &nbsp;&nbsp;<asp:Button ID="btnCancel" runat="server" CssClass="btn" Text="Cancel"
                            OnClick="btnCancel_Click" />
                    </td>
                </tr>
            </table>
        </ContentTemplate>
    </asp:UpdatePanel>



protected void BtnSave_Click(object sender, EventArgs e)
        {
            upProgress.Visible = false;
            string sLinks = "";
            int iLinks = 0;
            CheckBox chk;
            foreach (GridViewRow row in grdInvoice.Rows)
            {
                chk = (CheckBox)row.Cells[3].Controls[1];
                if (chk.Checked == true)
                {
                    sLinks += grdInvoice.DataKeys[row.RowIndex].Value.ToString() + ",";
                    iLinks = iLinks + 1;
                }

            }
}

最佳答案

您可以使用以下方法遍历行以找到被勾选的 CheckBox:

foreach (GridViewRow row in yourGrid.Rows)
{
    CheckBox chk = row.Cells[3].Controls[1] as CheckBox;
    if ((chk != null) && chk.Checked)
    {
        int yourID = Convert.ToInt32(yourGrid.DataKeys[row.RowIndex].Value);
        // Do something with each row here...
    }
}

您确定在保存按钮触发之前没有将回发时的网格重新绑定(bind)到空的 DataSource 吗?检查您的 PageLoad 事件。

我看到您有多个 UpdatePanel 控件。尝试在包含 GridViewUpdatePanel 中设置一个 Trigger 以链接到 Click带有保存按钮的 UpdatePanel。服务器端不再知道绑定(bind)到 GridView 的数据,或者 GridView 数据没有被发回服务器。

关于c# - 单击按钮时遍历 gridview 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21121248/

相关文章:

c# - 将 IP 地址转换并显示为二进制形式?

c# - 在 Windows 8.1 上禁用触摸视觉反馈(以编程方式)[桌面应用程序]

c# - 如何将 HttpWebRequest 与 GET 方法一起使用

c# - 如何在 visual studio 2010 中添加 System.Windows.Forms

gridview - Yii2 数据方法帖子在 gridView 中不起作用

c# - 如何将 GridView 中的行数作为参数传递给 OnRowCommand 调用

c# - 曼哈顿旅游问题的对角线计算

c# - 更改特定行的颜色 (TELERIK)

c# - 如果控件始终按照声明的顺序绑定(bind)到数据源控件,则

gridview - 动态填充 GridView 时应用程序启动缓慢