【问题标题】:Row Deleting event of a child gridview throwing exception in asp.net C#在asp.net C#中子gridview抛出异常的行删除事件
【发布时间】:2014-03-19 21:32:02
【问题描述】:

我进行了很多搜索,但找不到解决问题的方法。

使用 C#.Net、Asp.net 3.5 我在主子关系中有 2 个 gridview 控件,如下所示:

<asp:GridView  ID="gridViewExistingSchedules" 
                                    runat="server" DataKeyNames="SchedulerId"
                                    AutoGenerateColumns="false" 
                                    OnRowDataBound="gridViewExistingSchedules_RowDataBound"
                                    OnRowCommand="gridViewExistingSchedules_RowCommand" 
                                    OnRowDeleting="gridViewExistingSchedules_RowDeleting">

                                    <Columns>
                                        <asp:TemplateField ItemStyle-Width="20px">
                                            <ItemTemplate>
                                                    <asp:GridView 
                                                        ID="gridViewSchedulerDetails" 
                                                        runat="server" 
                                                        AutoGenerateColumns="false"
                                                        DataKeyNames="SchedulerId">

                                                        <Columns>
                                                            <asp:BoundField DataField="DetailId" Visible="false" />
                                                            <asp:BoundField DataField="Survey" HeaderText="Survey" />
                                                            <asp:BoundField DataField="TimeDescription" HeaderText="Time" />
                                                            <asp:BoundField DataField="FromDate" HeaderText="From Date" />
                                                            <asp:BoundField DataField="ToDate" HeaderText="To Date" />

                                                            <asp:TemplateField>
                                                                <ItemTemplate>
                                                                    <asp:ImageButton ID="imgDelete" CommandArgument='<%# Bind("SchedulerId")%>' CommandName="Delete"
                                                                        runat="server" ImageUrl="~/images/delete1.png" />
                                                                </ItemTemplate>
                                                            </asp:TemplateField>

                                                            <asp:TemplateField>
                                                                <ItemTemplate>
                                                                    <asp:ImageButton ID="imgEdit" CommandArgument='<%# Bind("SchedulerId")%>' CommandName="Edit"
                                                                        runat="server" ImageUrl="~/images/edit.png" />
                                                                </ItemTemplate>
                                                            </asp:TemplateField>
                                                        </Columns>
                                                    </asp:GridView>
                                                </div>
                                            </ItemTemplate>
                                            <ItemStyle Width="20px"></ItemStyle>
                                        </asp:TemplateField>
                                        <asp:BoundField DataField="Frequency" HeaderText="Frequency" />
                                        <asp:BoundField DataField="DayOfWeek" HeaderText="Day Of Week" />
                                        <asp:BoundField DataField="Time" HeaderText="Time" />
                                        <asp:BoundField DataField="NextRunOn" HeaderText="Next Run On" />
                                        <asp:TemplateField>
                                            <ItemTemplate>
                                                <asp:ImageButton ID="imgDelete" CommandArgument='<%# Bind("SchedulerId")%>' CommandName="Delete"
                                                    runat="server" ImageUrl="~/images/delete.png" />
                                            </ItemTemplate>
                                        </asp:TemplateField>
                                    </Columns>
                                </asp:GridView>

父/主网格视图“gridViewExistingSchedules”显示计划项目,而子网格视图“gridViewSchedulerDetails”显示计划项目的详细信息(如计划的项目等)

我想添加一个功能,其中可以删除/编辑详细网格视图中的一行(即 gridViewSchedulerDetails。我有以下处理 row_deleting 和 row_command 事件的代码:

protected void gridViewExistingSchedules_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                int schedulerId = int.Parse(this.gridViewExistingSchedules.DataKeys[e.Row.RowIndex].Value.ToString());
                GridView gvDetails = e.Row.FindControl("gridViewSchedulerDetails") as GridView;

                gvDetails.RowCommand += new GridViewCommandEventHandler(gvDetails_RowCommand);
                gvDetails.RowDeleting += new GridViewDeleteEventHandler(gvDetails_RowDeleting);

                UICaller caller = new UICaller();
                gvDetails.DataSource = caller.BindSchedulerDetails(schedulerId);
                gvDetails.DataBind();
            }
        }



void gvDetails_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            UIWriter writer = new UIWriter();
            if (e.CommandName.Equals("Delete"))
            {
                int surveyDetailId = int.Parse(e.CommandArgument.ToString());
                if (writer.RemoveSurvey(surveyDetailId))
                {
                    this.labelUserNotification.Text = "Deleted successfully";
                }
                else
                    this.labelUserNotification.Text = "Due to some internal error, selected item cannot be deleted";


                //bind existing scheduler
                UICaller caller = new UICaller();
                this.gridViewExistingSchedules.DataSource = caller.BindScheduler();
                this.gridViewExistingSchedules.DataBind();
            }
            else if (e.CommandName.Equals("Edit"))
            {
            }
        }



void gvDetails_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {


        }

上面给出的代码存在运行时异常:

"GridView 'gridViewSchedulerDetails' 触发的事件 RowDeleting 未被处理。"

首先我认为由于处于父/子关系主gridview需要处理子“gridViewSchedulerDetails”的row_command事件所以我将代码更改为:

void gvDetails_RowCommand(object sender, GridViewCommandEventArgs e)
        {

        }

        void gvDetails_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {


        }



protected void gridViewExistingSchedules_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            UIWriter writer = new UIWriter();
            if (e.CommandName.Equals("Delete"))
            {
                int surveyDetailId = int.Parse(e.CommandArgument.ToString());
                if (writer.RemoveSurvey(surveyDetailId))
                {
                    this.labelUserNotification.Text = "Deleted successfully";
                }
                else
                    this.labelUserNotification.Text = "Due to some internal error, selected item cannot be deleted";


                //bind existing scheduler
                UICaller caller = new UICaller();
                this.gridViewExistingSchedules.DataSource = caller.BindScheduler();
                this.gridViewExistingSchedules.DataBind();
            }
            else if (e.CommandName.Equals("Edit"))
            {
            }
        }


protected void gridViewExistingSchedules_RowDeleting(object sender, GridViewDeleteEventArgs e)
            {

            }

但我仍然收到上面给出的相同错误。 请告知我如何处理子gridview行删除以及这里实际发生的情况

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    您已在您的 aspx 代码中指定删除事件,并且该事件处理程序在您的 .cs 文件代码中不存在,这就是它产生问题的原因。要么编写如下事件处理程序。

    void gridViewExistingSchedules_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
    }
    

    如果您不需要,也可以从您的 aspx 代码中删除以下内容。

    OnRowDeleting="gridViewExistingSchedules_RowDeleting"
    

    【讨论】:

    • 你能粘贴你的代码吗?从您粘贴的代码中,cs 文件中缺少 gridViewExistingSchedules_RowDeleting 事件,而在您的 aspx 文件中它在那里。
    • 您仍然收到此错误吗?为什么你需要在 gridviewexistingschedules 网格上删除行从 aspx 中删除它
    • 是的..如果你看到错误是关于 gridViewSchedulerDetails,它是子网格。我实际上并不需要它,但由于子 gridview 问题我把它放在那里。我认为它类似于泡沫事件。
    • 我认为您的代码有问题。那里有很多名称,例如您正在使用的 gvDetails_RowDeleting?你能把你的代码写出来,然后正确地问它吗
    【解决方案2】:

    几件事...

    如果您指定OnRowCommand="gridViewExistingSchedules_RowCommand",那么从技术上讲,这也会捕获删除命令。因此,您可以删除 OnRowDeleting="gridViewExistingSchedules_RowDeleting" 并使用打开命令名称来捕获它。 (见这里http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowcommand%28v=vs.110%29.aspx

    除此之外,让我们继续讨论错误。

    GridView 'gridViewSchedulerDetails' 触发了未处理的事件 RowDeleting。

    您收到此消息是因为在未处理的 gridview gridViewSchedulerDetails 上调用了 delete 方法。您有 2 个选项可以摆脱它。

    1. 向子网格 (gridViewSchedulerDetails) 添加一个 OnRowDeleting 方法并处理它。
    2. 向子网格 (gridViewSchedulerDetails) 添加一个 OnRowCommand 方法并处理它。

    更新

    只是认为您的图像按钮包含命令名称deleteedit...它们分别用于事件删除和编辑并触发它们。当您在数据绑定中分配不同的事件时,这可能会导致冲突。尝试将图像按钮上的CommandName 更改为子网格视图中的deled,看看是否有帮助。

    【讨论】:

    • 但是我在gridViewExistingSchedules_RowDataBound中添加了
    • 嗯,我没看到。出于兴趣,您这样做是有原因的吗?您是否尝试过直接在gridViewSchedulerDetails 上指定OnRowCommand
    • 如果你把它放进去你的代码会发生什么...void gridViewSchedulerDetails_RowDeleting(object sender, GridViewDeleteEventArgs e) { }
    • 我尝试根据您的更新将名称更改为 del 和 ed,但没有成功。但是客户要求更改 UI,所以现在情况并非如此。但是原始问题仍然存在,为什么子网格视图删除/编辑无法正常工作。
    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多