[英]Row Deleting event of a child gridview throwing exception in asp.net C#
我進行了很多搜索,但找不到解決我問題的方法。
使用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>
父/主gridview“ gridViewExistingSchedules”顯示計划的項目,而子gridview“ gridViewSchedulerDetails”顯示計划項目的詳細信息(例如計划了哪些項目等)。
我想添加一個功能,其中詳細的gridview中的一行(即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行刪除,以及此處實際發生的情況
您已在aspx代碼中指定了刪除事件,而.cs文件代碼中沒有該事件處理程序,這就是它造成問題的原因。 編寫如下的事件處理程序。
void gridViewExistingSchedules_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
}
或從不需要的aspx代碼中刪除以下內容。
OnRowDeleting="gridViewExistingSchedules_RowDeleting"
幾件事...
如果您指定OnRowCommand="gridViewExistingSchedules_RowCommand"
那么從技術上講,這也會捕獲刪除命令。 因此,您可以刪除OnRowDeleting="gridViewExistingSchedules_RowDeleting"
並使用打開的命令名捕獲它。 (請參見http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.gridview.rowcommand%28v=vs.110%29.aspx )
順便說一句,讓我們繼續錯誤。
GridView'gridViewSchedulerDetails'觸發了未處理的事件RowDeleting。
之所以會收到此消息,是因為在gridViewSchedulerDetails
的gridview gridViewSchedulerDetails
上調用了delete方法。 您有2種選擇可以擺脫它。
OnRowDeleting
方法添加到OnRowDeleting
格( gridViewSchedulerDetails
)並進行處理。 OnRowCommand
方法添加到OnRowCommand
格( gridViewSchedulerDetails
)並進行處理。 更新
只是以為您的圖像按鈕包含命令名稱delete
和edit
...這些分別保留給事件delete和edit並觸發它們。 當您在數據綁定中分配不同的事件時,這可能會導致沖突。 嘗試將圖像按鈕上的CommandName
更改為子網格視圖中的del
和ed
,看看是否有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.