ASPxGridView.CustomButtonCallback 是異步回調事件,無法直接使用 Response.Write、ScriptManager.RegisterStartupScript 或 Page.ClientScript.RegisterClientScriptBlock 彈窗,因為回調響應不執行完整頁面生命週期。
// 不推薦:異常用於控制流程,污染日志,性能差
protected void Grid_CustomButtonCallback(object sender, ASPxGridViewCustomButtonCallbackEventArgs e)
{
throw new Exception("操作成功!");
}
protected void Grid_CallbackError(object sender, EventArgs e)
{
// 前台 JS 判斷 e.message 彈窗
}
protected void ASPxGridView1_CustomButtonCallback(object sender, ASPxGridViewCustomButtonCallbackEventArgs e)
{
var grid = sender as ASPxGridView;
if (e.ButtonID == "btnAudit")
{
int id = Convert.ToInt32(grid.GetRowValues(e.VisibleIndex, "ID"));
bool success = AuditOrder(id); // 業務邏輯
// 關鍵:鍵名必須以 "cp" 開頭 (Client Property)
grid.JSProperties["cpResult"] = success ? "success" : "failed";
grid.JSProperties["cpMessage"] = success ? "審核成功!" : "該單據已審核,請勿重複操作。";
}
}
function OnCustomButtonCallback(s, e) {
// s = grid 客戶端對象
if (s.cpResult) {
if (s.cpResult === "success") {
alert(s.cpMessage); // 或使用 DevExpress UI: DevExpress.ui.notify(s.cpMessage, "success", 3000);
} else {
alert(s.cpMessage); // 或 "error" 類型提示
}
}
}
// 綁定事件
// <ClientSideEvents CustomButtonCallback="OnCustomButtonCallback" />
ASPxGridView.JSProperties 同理適用於 RowInserting、RowUpdating、BatchUpdate 等回調事件。public static class GridViewExtensions
{
public static void ShowMessage(this ASPxGridView grid, string message, string type = "info")
{
grid.JSProperties["cpToastMessage"] = message;
grid.JSProperties["cpToastType"] = type; // success, error, warning, info
}
}
// 使用
grid.ShowMessage("保存成功", "success");
DevExpress 回調事件中彈窗/提示的標準模式是:後台設置 JSProperties["cpXxx"] → 前台 CustomButtonCallback / EndCallback 事件讀取 s.cpXxx 並調用 UI 組件顯示。拋棄異常控制流,擁抱屬性傳遞模式。