嵌套Gridview RowCommand事件导致Parent Gridview RowCommand触发

本文关键字:Gridview RowCommand Parent 触发 事件 嵌套 | 更新日期: 2023-09-27 17:49:22

我有两个gridview,一个是parent,另一个是child,每个gridview都有自己的OnRowCommand事件。当gridview行命令为子行触发时,父行的行命令事件被触发。这导致gvProject行命令错误(当我们有几个项目和许多文件夹时)

错误:索引超出范围。必须非负且小于集合。参数名称:index

我该如何解决这个问题?这是我的gridView:

<asp:GridView ID="gvProject" runat="server" SkinID="ExpandableGrid" DataSourceID="odsProject" DataKeyNames="ID" OnRowDataBound="gvProject_RowDataBound" OnRowCommand="gvProject_RowCommand">
                                <Columns>
                                    <asp:TemplateField>
                                        <ItemTemplate>
                                            <i class="btnCollapseExpand icon contrast-color collapse icon-ellipsis-h fright" onclick="ExpandCollapseGridView(this);" style="cursor: pointer"></i>
                                        </ItemTemplate>
                                    </asp:TemplateField>
                                    <asp:TemplateField HeaderText="<%$ Resources:Titles, Select %>">
                                        <ItemTemplate>
                                            <asp:CheckBox ID="chbSelect" runat="server" TabIndex="9" CssClass="contrast-checkbox" />
                                        </ItemTemplate>
                                        <ItemStyle CssClass="center" />
                                        <HeaderStyle CssClass="center" />
                                    </asp:TemplateField>
                                    <asp:BoundField HeaderText="<%$ Resources:Titles,Code %>" DataField="Code" SortExpression="Code"></asp:BoundField>
                                    <asp:BoundField HeaderText="<%$ Resources:Titles,Name %>" DataField="Name" SortExpression="Name">
                                        <ItemStyle CssClass="col-xs-3 col-sm-3 col-md-3 col-lg-4" />
                                    </asp:BoundField>
                                    <asp:BoundField HeaderText="<%$ Resources:Titles, Customer %>" DataField="Customer" SortExpression="Customer.Name">
                                        <ItemStyle CssClass="col-xs-3 col-sm-3 col-md-3 col-lg-4" />
                                    </asp:BoundField>
                                    <asp:BoundField HeaderText="<%$ Resources:Titles,ProgressStatus %>" DataField="ProjectStatus" SortExpression="ProjectStatus.Name">
                                        <ItemStyle CssClass="col-xs-3 col-sm-3 col-md-3 col-lg-2" />
                                    </asp:BoundField>
                                    <asp:TemplateField HeaderText="<%$ Resources:Titles, ActivityStatus%>" SortExpression="Status">
                                        <ItemTemplate>
                                            <%#System.Convert.ToString(Convert.ToBoolean(Eval("Status") ) ? Resources.Titles.Enable : Resources.Titles.Disable) %>
                                        </ItemTemplate>
                                        <ItemStyle CssClass="col-xs-3 col-sm-3 col-md-3 col-lg-2" />
                                    </asp:TemplateField>
                                    <asp:TemplateField HeaderText="<%$ Resources:Titles, Edit %>">
                                        <ItemTemplate>
                                            <a id="IbtnEdit" tabindex="11" href="ProjectDetail.aspx?Edit=<%# Eval("ID").ToString() %>" class="btnIcon hasTooltip" title="<%= Resources.Titles.EditProject %>"><i class="icon icon-edit"></i></a>
                                        </ItemTemplate>
                                        <ItemStyle CssClass="center" />
                                        <HeaderStyle CssClass="center" />
                                    </asp:TemplateField>
                                    <asp:TemplateField HeaderText="<%$ Resources:Titles, Delete %>">
                                        <ItemTemplate>
                                            <asp:LinkButton ID="lbtnDeleteProject" TabIndex="12" runat="server" CommandName="DeleteProject" title="<%$ Resources:Titles,DeleteProject %>" CommandArgument='<%# ((GridViewRow)Container).RowIndex %>' CssClass="btnIcon hasTooltip">
                                                 <i class="icon icon-trash-o"></i>
                                            </asp:LinkButton>
                                        </ItemTemplate>
                                        <ItemStyle CssClass="center" />
                                        <HeaderStyle CssClass="center" />
                                    </asp:TemplateField>
                                    <asp:TemplateField HeaderText="<%$ Resources:Titles, AddFolder %>">
                                        <ItemTemplate>
                                            <asp:LinkButton ID="lbtnAddFolder" TabIndex="13" runat="server" CommandName="AddFolder" title="<%$ Resources:Titles,AddFolder %>" CommandArgument='<%# ((GridViewRow)Container).RowIndex %>' CssClass="btnIcon hasTooltip">
                                                 <i class="icon icomoon-icon-AddFolder"></i>
                                            </asp:LinkButton>
                                        </ItemTemplate>
                                        <ItemStyle Width="5%" CssClass="center" />
                                        <HeaderStyle CssClass="center" />
                                    </asp:TemplateField>
                                    <asp:TemplateField>
                                        <ItemTemplate>
                                            <tr class="collapsible_panel" height="50px" id="detailRow<%# ((GridViewRow)Container).RowIndex %>">
                                                <td colspan="100%">
                                                    <div class="collapsible_panel_content">
                                                        <asp:GridView ID="gvFolders" runat="server" DataKeyNames="ID" OnRowCommand="gvFolders_RowCommand">
                                                            <Columns>
                                                                <asp:BoundField HeaderText="<%$ Resources:Titles,FolderName %>" DataField="Name" SortExpression="Name">
                                                                    <ItemStyle CssClass="col-xs-2 col-sm-2 col-md-2 col-lg-2" />
                                                                </asp:BoundField>
                                                                <asp:TemplateField HeaderText="<%$ Resources:Titles,FolderCode %>">
                                                                    <ItemTemplate>
                                                                        <%#System.Convert.ToString(Eval("Code").ToString().Trim())%>
                                                                    </ItemTemplate>
                                                                    <ItemStyle CssClass="col-xs-2 col-sm-2 col-md-2 col-lg-2" />
                                                                </asp:TemplateField>
                                                                <asp:TemplateField HeaderText="<%$ Resources:Titles,Creator %>">
                                                                    <ItemTemplate>
                                                                        <%#System.Convert.ToString(GetUser(Eval("OwnerID")))%>
                                                                    </ItemTemplate>
                                                                    <ItemStyle CssClass="col-xs-2 col-sm-2 col-md-2 col-lg-2" />
                                                                </asp:TemplateField>
                                                                <asp:TemplateField HeaderText="<%$ Resources:Titles, Edit %>">
                                                                    <ItemTemplate>
                                                                        <asp:LinkButton ID="lbtnEditFolder" TabIndex="7" runat="server" CommandName="EditFolder" title="<%$ Resources:Titles,EditFolder %>" CommandArgument='<%# ((GridViewRow)Container).RowIndex %>' CssClass="btnIcon hasTooltip">
                                                                            <i class="icon icon-edit"></i>
                                                                        </asp:LinkButton>
                                                                    </ItemTemplate>
                                                                    <ItemStyle CssClass="center col-xs-1 col-sm-1 col-md-1 col-lg-1" />
                                                                    <HeaderStyle CssClass="center" />
                                                                </asp:TemplateField>
                                                                <asp:TemplateField HeaderText="<%$ Resources:Titles, Delete %>">
                                                                    <ItemTemplate>
                                                                        <asp:LinkButton ID="lbtnDeleteFolder" TabIndex="7" runat="server" CommandName="DeleteFolder" title="<%$ Resources:Titles,DeleteFolder %>" CommandArgument='<%# ((GridViewRow)Container).RowIndex %>' CssClass="btnIcon hasTooltip">
                                                                            <i class="icon icon-trash-o"></i>
                                                                        </asp:LinkButton>
                                                                    </ItemTemplate>
                                                                    <ItemStyle CssClass="center col-xs-1 col-sm-1 col-md-1 col-lg-1" />
                                                                    <HeaderStyle CssClass="center" />
                                                                </asp:TemplateField>
                                                            </Columns>
                                                        </asp:GridView>
                                                    </div>
                                                </td>
                                            </tr>
                                        </ItemTemplate>
                                        <HeaderStyle CssClass="noPadding" />
                                        <ItemStyle Width="0px" CssClass="noPadding" />
                                    </asp:TemplateField>
                                </Columns>
                                <EmptyDataTemplate>
                                    <%= Resources.Messages.NoProjectIsForView %>
                                </EmptyDataTemplate>
                            </asp:GridView>

这是我的行命令事件:

    protected void gvProject_RowCommand(object sender, GridViewCommandEventArgs e)
{
    int rowIndex, id;
    rowIndex = Convert.ToInt32(e.CommandArgument);
    GridView grid = (GridView)sender;
    if (grid.ID == "gvProject")
    {
        id = Convert.ToInt32(grid.DataKeys[rowIndex].Value);
        switch (e.CommandName)
        {
            case "DeleteProject":
                ClearForm();
                hfID.Value = id.ToString();
                HiddenField1.Value = id.ToString();
                lblDeleteMessage.Text = string.Empty;
                Global.ShowModalBox(upProjectDelete, "delete_modal");
                break;
            case "AddFolder":
                ClearForm();
                hfID.Value = id.ToString();
                Global.ShowModalBox(upAddFolder, "AddFolderModal");
                break;
        }
    }
}
protected void gvFolders_RowCommand(object sender, GridViewCommandEventArgs e)
{
    int rowIndex, id;
    rowIndex = Convert.ToInt32(e.CommandArgument);
    GridView grid = (GridView)sender;
    id = Convert.ToInt32(grid.DataKeys[rowIndex].Value);
    switch (e.CommandName)
    {
        case "EditFolder":
            if (grid.ID == "gvFolders")
            {
                ClearForm();
                hfID.Value = id.ToString();
                Folder folder = Providers.Folder.GetById(id);
                txtFolderName.Text = folder.Name;
                EditType = eEditType.Edit;
                lblBoxTitle.Text = Resources.Titles.EditFolder;
                Global.ShowModalBox(upAddFolder, "AddFolderModal");
            }
            break;
        case "DeleteFolder":
            if (grid.ID == "gvFolders")
            {
                ClearForm();
                hfID.Value = id.ToString();
                lblDeleteFolderMessage.Text = string.Empty;
                Global.ShowModalBox(upAddFolder, "DeleteFolderModal");
            }
            break;
    }
}

嵌套Gridview RowCommand事件导致Parent Gridview RowCommand触发

我认为解决这个问题的唯一方法是检查gvproject行命令事件中的命令名称:

protected void gvProject_RowCommand(object sender, GridViewCommandEventArgs e)
   {
    int rowIndex, id;
    rowIndex = Convert.ToInt32(e.CommandArgument);
    GridView grid = (GridView)sender;
    if (e.CommandName == "DeleteProject" || e.CommandName == "AddFolder")
    {
        id = Convert.ToInt32(grid.DataKeys[rowIndex].Value);
        ...    
    }
}