J'ai un peu de JavaScript dans l'une de mes pages qui évite le problème des utilisateurs boutons double-cliquant sur une forme et provoquant doubles présentations lors de postbacks asynchrones:id élément null pour DataGrid ButtonColumns
var prm = Sys.WebForms.PageRequestManager.getInstance(); prm.add_initializeRequest(InitializeRequest); prm.add_endRequest(EndRequest);
var btn;
function InitializeRequest(sender, args) {
document.body.style.cursor = "wait";
var btnId = args._postBackElement.id;
btn = document.getElementById(btnId);
if (btn != null && (btn.type == "button" || btn.type == "submit"))
btn.disabled = true;
}
function EndRequest(sender, args) {
document.body.style.cursor = "default";
if (btn != null) btn.disabled = false;
}
Cela ne fonctionne pas avec DataGrid ButtonColumns. document.getElementById (btnId) renvoie null pour ceux-ci.
Si j'utilise un TemplateColumn et que je place un contrôle Button à l'intérieur, cela fonctionne correctement.
En regardant le code HTML qui obtient rendu pour la DataGrid, je peux voir que ASP.NET n'est pas fournir en sortie un onclick pour le ButtonColumn, où il ne fait donc un bouton à l'intérieur d'un TemplateColumn:
ButtonColumn :
<input type="submit" name="ctl00$placeholderContent$dgCommittees$ctl03$ctl00" value="Edit" />
Button dans TemplateColumn:
<input type="submit" name="ctl00$placeholderContent$dgCommittees$ctl03$cmdDelete" value="Delete" onclick="return confirm('Are you sure you wish to delete this committee?'); WebForm_DoPostBackWithOptions( new WebForm_PostBackOptions("ctl00$placeholderContent$dgCommittees$ctl03$cmdDelete", "", true, "", "", false, false))" id="ctl00_placeholderContent_dgCommittees_ctl03_cmdDelete" />
Évidemment la réponse à "comment puis-je faire ce travail?" est de simplement remplacer tous mes ButtonColumns avec des boutons dans TemplateColumns. Je suis curieux si quelqu'un sait pourquoi ASP.NET rend ButtonColumns de cette façon, et s'il y a un moyen de le rendre le même que les boutons.