在 UI 中删除 GridView 行时(通过其 CommandName="Delete" 的 LinkButton),视图不会自动刷新并继续显示已删除的行,直到我采取其他操作(手动刷新页面,导航离开并再次返回, ETC)。
在调试器中,我看到该行已成功删除,并且 RowDeleting 和 RowDeleted 事件都会触发,但 GridView 的 PreRender 事件之后不会触发(相反,当第一次加载页面时,添加新行时会触发 PreRender 事件, ETC)。
我在类似的配置中使用了 GridViews,没有遇到这个问题,但我没有看到明显的差异。似乎该过程在 PreRender 事件之前中止,但没有引发异常,并且在调试器中退出 RowDeleted 事件的结尾让我回到 UI,就好像该过程正常完成一样。
我应该在哪里寻找问题或解决方案的任何想法?其他可能相关的细节:GridView 绑定到 SqlDataSource;数据源未声明任何 DeleteCommand;我通过调用 RowCommand 处理程序中的存储过程来处理删除,然后我使用 DataBind() 重新绑定 GridView,此时我可以看到 GridView 的 Rows.Count 已按预期减少了 1。通过 RowDeleted 事件,一切似乎都很好,然后……什么都没有!
更新:尝试在 RowDeleting 处理程序而不是 RowCommand 处理程序中调用 SP 删除...没有任何区别。该行仍然被删除,但处理终止而不调用 GridView 的 PreRender,并且被删除的行保持显示,直到进一步的 UI 交互更新视图。
UPDATE2:我什至没有得到页面的 PreRender 事件,该事件先于控件 PreRender 事件。将继续向后工作,看看我是否能找到事情停止的地方,因为退出 RowDeleted 事件似乎是该行的结尾......
UPDATE3:我一直在探索更多,虽然它使我的代码复杂化,但我能够通过在 GridView 的 SqlDataSource 中声明一个 DeleteCommand 来使事情正常工作,它只是执行简单的行(记录)删除,然后在 RowDeleted 处理程序中调用我在存储过程中需要与主要删除一起发生的其他内容。虽然在一个地方进行主要删除并在另一个地方进行相关处理不太方便,但至少它是有效的。
但我不知道从中得出什么结论:正确的页面生命周期需要 DeleteCommand 吗?不应该在 RowCommand 处理程序的存储过程中进行删除?别的东西?我希望我能确定我最初尝试的具体问题是什么......