When deleting a GridView row in the UI (via a LinkButton whose CommandName="Delete"), the view does not automatically refresh and continues to display the deleted row until I take some other action (manually refresh page, navigate away and back again, etc).
In the debugger, I see the row is successfully deleted, and both the RowDeleting and RowDeleted events fire, but the GridView's PreRender event does not fire afterwards (in contrast, that PreRender event does fire when first loading the page, when adding a new row, etc).
I've used GridViews in similar configurations without having this problem, but I don't see obvious differences. It seems the process is aborting before the PreRender event, but no exceptions are being thrown, and stepping off the end of the RowDeleted event in the debugger brings me back to the开发者_如何转开发 UI as though the process were completing normally.
Any ideas where I should look for the trouble or a solution? Other possibly-relevant details: the GridView is bound to a SqlDataSource; the data source does not declare any DeleteCommand; I handle the deletion by calling a stored procedure in the RowCommand handler, after which I rebind the GridView with DataBind(), at which point I can see the GridView's Rows.Count has decreased by one as I'd expect. Everything seems fine through the RowDeleted event, then... nothing!
UPDATE: tried calling the SP to delete in the RowDeleting handler rather than RowCommand handler... made no difference. The row is still deleted but processing terminates without calling the GridView's PreRender, and the deleted row is left on display until some further UI interaction updates the view.
UPDATE2: I'm not even getting the Page's PreRender event, which precedes the control PreRender events. Will continue working backwards to see if I can find where things are halting, since stepping out of the RowDeleted event seems to be the end of the line...
UPDATE3: I've been poking around some more and, although it complicates my code, I was able to get things working by declaring a DeleteCommand in the GridView's SqlDataSource that just does the simple row (record) deletion, and then in the RowDeleted handler calling the additional stuff I had in my stored procedure that needs to happen along with the primary deletion. While it's less convenient having the primary deletion in one place and the related processing in another, at least it's working.
But I don't know what to conclude from this: that a DeleteCommand is needed for proper page life cycle? that one shouldn't do a deletion in a stored procedure in the RowCommand handler? something else? I wish I could identify what, specifically, is broken about my initial attempt...
just bind the gridview with the fresh data from database after deleting the row.
Do PreRender events fire on postbacks on your other pages? The information on this MSDN article (under the "Postback and Non-Postback Events in Server Controls" heading, paragraph after the note) makes me wonder if only the Init and Load events fire for the page and all child controls.
精彩评论