2009-04-20 26 views
1

我有一些JavaScript在我的網頁之一,避免用戶雙擊窗體上按鈕,並在異步回發導致雙提交問題:null元素ID爲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; 
} 

這不適用於DataGrid ButtonColumns。 document.getElementById(btnId)爲那些返回null。

如果我使用TemplateColumn並把一個Button控件裏面,那很好。

望着那獲取呈現DataGrid的HTML,我可以看到,ASP.NET不輸出爲ButtonColumn,如果它確實爲TemplateColumn中內按鈕做一個onclick:

ButtonColumn :

 
<input type="submit" 
    name="ctl00$placeholderContent$dgCommittees$ctl03$ctl00" 
    value="Edit" /> 

按鈕在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" /> 

顯然是「我如何使這項工作?」的答案。是簡單地用TemplateColumns中的按鈕替換我所有的ButtonColumns。

我很好奇,如果有人知道爲什麼雖然ASP.NET以這種方式呈現ButtonColumns,並且如果有一些方法可以使它們呈現與按鈕相同的方式。

回答

2

MS有一個綁定字段的標準實現,它沒有爲ButtonColumn創建的按鈕設置ID或屬性。

要成爲一個更具體一點,每當網格生成細胞和子順序按鈕,它調用InitializeCell:

public override void InitializeCell(TableCell cell, int columnIndex, ListItemType itemType) 
{ 
    base.InitializeCell(cell, columnIndex, itemType); 
    if ((itemType != ListItemType.Header) && (itemType != ListItemType.Footer)) 
    { 
     WebControl child = null; 
     if (this.ButtonType == ButtonColumnType.LinkButton) 
      ... 
     else 
     { 
      child = new Button { 
       Text = this.Text, 
       CommandName = this.CommandName, 
       CausesValidation = this.CausesValidation, 
       ValidationGroup = this.ValidationGroup 
      }; 
     } 
     ... 
     cell.Controls.Add(child); 
    } 
} 

正如你所看到的,就是所有的按鈕。

如果你希望它有ID和「點擊」屬性,你可以使用這樣的事情:

protected void grid_RowCreated(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     //assuming that a first cell is a ButtonField 
     //note that in edit mode a button may be at some other index that 0 
     Button btn = e.Row.Cells[0].Controls[0] as Button; 
     if (btn != null) 
     { 
      btn.OnClientClick = "return confirm('are you sure?')"; 
      btn.ID = "myButtonX"; 
     } 
    } 
} 
1

我建議您使用JQuery在按鈕上添加事件處理程序。下面是一個示例:


function onclick() { 
    alert("1"); 
} 
$(function() { 
    $("input[type='submit']").click(onclick); 
}); 

此代碼將在onclick功能附加到onclick事件submit類型的所有input元素時的DOM已準備就緒。

unobtrusive JavaScript技術可能會讓你感興趣。

我想提一下,微軟支持JQuery,他們會在即將發佈的Visual Studio版本中爲它提供支持。欲瞭解更多信息,請訪問http://live.visitmix.com/