当我在GridView中进行排序时,会触发RowCommand事件。

4

我遇到了一个异常问题。当我在gridview中进行排序时,它会触发该网格的RowCommand事件而不是排序事件。下面是我的gridview的HTML代码。

<asp:GridView ID="grdDefects" runat="server" AutoGenerateColumns="False"    OnPageIndexChanging="grdDefects_PageIndexChanging"
                OnSorting="grdDefects_Sorting" OnRowCommand="grdDefects_RowCommand"  AllowSorting="true">
                <PagerSettings Mode="NumericFirstLast" FirstPageText="First"  LastPageText="Last"
                    NextPageText="Next" PreviousPageText="Prev" />
                <Columns>
                    <%--<asp:TemplateField HeaderText="Id" SortExpression="ReasonID" Visible="false">
                        <ItemTemplate>
                            <asp:Label ID="lblReasonID" runat="server" Text='<%#  Bind("ReasonID") %>'></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>--%>
                    <asp:BoundField DataField="DefectId" HeaderText="Id" />
                    <asp:BoundField DataField="DefectName" HeaderText="Defect"  sortExpression="DefectName" />
                    <asp:BoundField DataField="Department" HeaderText="Department Name" sortExpression="Department" />

                   <%-- <asp:ButtonField ControlStyle-CssClass="btns" ButtonType="Button" CommandName="Update"
                        Text="Edit" >
<ControlStyle CssClass="btns"></ControlStyle>
                    </asp:ButtonField>--%>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:Button ID="editBtn" runat="server" Text="EDIT"  CommandArgument='<%# Eval("DefectId") %>' CssClass="btns"/>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>

//这里是处理这些事件的代码。

protected void grdDefects_Sorting(object sender, GridViewSortEventArgs e)
{
    try
    {
        if (ViewState["sortMode"] == null)
        {
            ViewState["sortMode"] = strSORT_DESC;
        }
        else if(ViewState["sortMode"]!=null)
        {
            if (ViewState["sortMode"].ToString().Equals("strSORT_ASC"))
                ViewState["sortMode"] = strSORT_DESC;
            else
                ViewState["sortMode"] = strSORT_ASC;
        }
        //string strSortExpression = e.SortExpression;
        ViewState["sortExpression"] = e.SortExpression;
        sort();

    }
    catch (Exception ex)
    {
        throw ex;
    }  
}

protected void grdDefects_RowCommand(object sender, GridViewCommandEventArgs e)
{
    try
    {
        int Id = Convert.ToInt32(e.CommandArgument);
        Response.Redirect("AddDefect.aspx?Id=" + Id);
    }
    catch (Exception ex)
    {

        throw;
    }
}

如何解决这个问题?

请在您处理行命令和排序事件的代码处发布您的代码。 - Pavitar
@Pavitar。我已经更新了我的问题。你现在可以看到代码了。 - Microsoft Developer
1
尝试调试,在grdDefects_RowCommand事件中,像您的情况一样在语句if(e.CommandName == "Update")处设置断点,并检查是否触发了该断点。您有其他命令字段吗? - Pavitar
排序和分页会在 Rowcommand 中冒泡处理,这很正常。你做错了的是没有将你的代码放在 if 语句块内,检查特定的命令名。if(e.RowCommand == "redirect") { ... } - Vaibhav Garg
1个回答

26

你是否尝试在grdDefects_RowCommand中检查commandName?

无论是在标题行还是普通行中点击任何按钮,RowCommand事件都会触发。只需防止在排序事件时执行代码。

将代码从RowCommand事件移动到此块中。

If (e.CommandName !="Sort")
{
}

没有,我还没有检查过,但是由于我已经处理了网格视图的排序事件,所以当我进行排序时它必须被触发。在其他页面中它运行得非常完美。 - Microsoft Developer
@Needo请在if(e.CommandName != "Sort")后添加双引号关闭。如果他这样做,他将不知道为什么会调用grdDefects_RowCommand,并且哪个CommandName被调用。因为现在,他的排序不起作用。所以这将使他无法前进。 - Pavitar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接