获取已检查行的行索引

时间:2013-12-29 07:54:26

标签: c# asp.net gridview checkbox

当我的checkbox中的gridview列被标记时,我正在尝试这样做,我得到了行索引。我的gridview位于转发器中,当我设置gridview时,我放了一个DataKeyNames

<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
                    <ItemTemplate>
<asp:Panel ID="pBody1" runat="server" CssClass="cpBody">
                            <asp:Label ID="lblBodyText1" runat="server" />
                            <!-- Grid view to show products based on each category -->
                            <asp:GridView ID="gvProduct" runat="server" AutoGenerateColumns="False" Width="998px" CellPadding="4" ForeColor="#333333" GridLines="None" ShowHeader="False" DataKeyNames="id">
                                <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                                <Columns>
                                    <asp:TemplateField ItemStyle-HorizontalAlign="Center">
                                        <ItemTemplate>
                                            <asp:CheckBox ID="cbCheckRow" runat="server" />
                                        </ItemTemplate>
                                    </asp:TemplateField>
                                    <asp:BoundField DataField="name" HeaderText="Name" ItemStyle-Width="600px" />
                                    <asp:BoundField DataField="categoryName" HeaderText="Category" />
                                    <asp:TemplateField HeaderText="Quantity" ItemStyle-HorizontalAlign="Center">
                                        <ItemTemplate>
                                            <asp:TextBox ID="tbQuantity" runat="server" Width="60" Text='<%# DataBinder.Eval(Container.DataItem, "inventoryQuantity") %>'/>
                                        </ItemTemplate>
                                    </asp:TemplateField>

                                </Columns>
                            </asp:GridView>
                        </asp:Panel>
                        <asp:CollapsiblePanelExtender ID="cpe1" runat="server" TargetControlID="pBody1" CollapseControlID="pHeader1"
                            ExpandControlID="pHeader1" Collapsed="true" ImageControlID="imgArrows1"
                            CollapsedImage="~/Images/downarrow.jpg"
                            ExpandedImage="~/Images/uparrow.jpg" TextLabelID="lblHeaderText1" CollapsedText="Show"
                            ExpandedText="Hide" CollapsedSize="0"
                            ScrollContents="false">
                        </asp:CollapsiblePanelExtender>
                    </ItemTemplate>
                </asp:Repeater>
 <asp:LinkButton ID="lbnConfirm" runat="server" class="btn dark" style="float: right" OnClick="lbnConfirm_Click">Confirm</asp:LinkButton>

当我的lbnConfirmonclick时,我执行此操作以获取行索引并将其存储到列表中:

 protected void lbnConfirm_Click(object sender, EventArgs e)
    {
        GridView gv = (GridView)Repeater1.FindControl("gvProduct") as GridView;
        foreach (GridViewRow gr in gv.Rows)
        {
            CheckBox cb = (CheckBox)gr.Cells[0].FindControl("cbCheckRow");
            if (cb.Checked)
            {
                GridViewRow row = gv.SelectedRow;
                string prodID = this.gv.DataKeys[row].Value.ToString();
                List<DistributionStandardPackingUnitItems> distSPUList = new List<DistributionStandardPackingUnitItems>();
                //Store the prodIDs into list
            }

        }
    }

当我运行该页面时,它在此行告诉我object reference is not set to an instance

foreach (GridViewRow gr in gv.Rows)

此行的gv

string prodID = this.gv.DataKeys[row].Value.ToString(); 

告诉我,gv不包含缺失引用的定义。我以为我在上面的代码中声明了?

编辑部分:

       protected void lbnConfirm_Click(object sender, EventArgs e)
    {
        foreach (RepeaterItem item in Repeater1.Items)
        {
            if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
            {
                Panel pnl = item.FindControl("pBody1") as Panel;
                GridView gv = pnl.FindControl("gvProduct") as GridView;
                foreach (GridViewRow gr in gv.Rows)
                {
                    CheckBox cb = (CheckBox)gr.Cells[0].FindControl("cbCheckRow");
                    if (cb.Checked)
                    {
                        string prodID = gv.DataKeys[gr.RowIndex].Value.ToString();
                        tempList.Add(prodID);
                        for (int count = 0; count < tempList.Count; count++)
                        {
                            lblTest.Text = tempList[count] + ",";
                        }
                    }
                }
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

您的方法是正确的,但您需要考虑更多的事情:

  1. 您必须遍历Repeater项,然后找到Panel 每个项目。

  2. 您必须在GridView内找到Panel,而不是Repeater

  3. 您必须按DataKey找到RowIndex值,而不是按行找到。

  4. 编辑:要进行测试,请在转发器外添加标签:

    <asp:Label ID="lblTest" runat="server" Text=""></asp:Label>
    

    同时更改代码以在标签中显示Id。

    重写lbnConfirm_Click()方法后,它应如下所示:

    protected void lbnConfirm_Click(object sender, EventArgs e)
    {
        List<string> tempList = new List<string>();
        foreach (RepeaterItem item in Repeater1.Items)
        {
            if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
            {
                Panel pnl = item.FindControl("pBody1") as Panel;
    
                GridView gv = pnl.FindControl("gvProduct") as GridView;
                foreach (GridViewRow gr in gv.Rows)
                {
                    CheckBox cb = (CheckBox)gr.Cells[0].FindControl("cbCheckRow");
                    if (cb.Checked)
                    {
                        //GridViewRow row = gv.SelectedRow;
                        string prodID =  gv.DataKeys[gr.RowIndex].Value.ToString();
                        List<DistributionStandardPackingUnitItems> distSPUList = new List<DistributionStandardPackingUnitItems>();
                        //Store the prodIDs into list
                        tempList.Add(prodID);                        
                    }
    
                }
            }
        }  
    
        lblTest.Text = string.Join(",", tempList);       
    }
    

    上面的代码在我的测试中运行良好!只有你必须小心不要在Page_Load()中回发重新绑定转发器。

    希望它有所帮助!

答案 1 :(得分:0)

获取RowDataBound事件中的行索引:

 protected void gvProduct_RowDataBound(Object sender, GridViewRowEventArgs e)
    {

       if(e.commandName=="select")
       {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            int index = e.Row.RowIndex;

            CheckBox chk = (CheckBox)e.Row.FindControl("cbCheckRow"); 
            int code = Convert.ToInt32(this.gvProduct.DataKeys[e.Row.RowIndex].Value);

        }
     }

    }