2009-02-10 77 views
0

我們有一個簡單的數據網格。每一行都有一個複選框。該複選框設置爲autopostback,並且代碼隱藏具有複選框檢查更改事件的事件處理程序。這一切都按預期工作,沒有什麼複雜的。幫助DataGrid/CheckBoxes /雙提交

但是,我們希望在檢查一個選項以禁止雙重提交,即複選框選中時禁用複選框,所有複選框都將通過客戶端JavaScript表單提交禁用。

要做到這一點我我們注入一些代碼,如下onclick事件(注意,警報是隻是用於測試!):

Protected Sub DgAccounts_ItemCreated(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles DgAccounts.ItemCreated 
    If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then 
     Dim chk As CheckBox = CType(e.Item.FindControl("chkItemChecked"), CheckBox)    
     chk.Attributes.Add("onclick", "alert('fired ...');DisableAllDataGridCheckBoxes();") 
    End If 
End Sub 

在視察呈現的頁面,我們得到的來源如下:

<input id="DgAccounts__ctl2_chkItemChecked" type="checkbox" name="DgAccounts:_ctl2:chkItemChecked" onclick="alert('fired ...');DisableAllDataGridCheckBoxes();setTimeout('__doPostBack(\'DgAccounts$_ctl2$chkItemChecked\',\'\')', 0)" language="javascript" /> 

這一切都出現在順序,但是服務器端事件不火 - 我相信這是由於該複選框被禁用,因爲如果我們只是留在警報和解除呼叫保留禁用複選框它一切正常。

即使複選框被禁用,我是否可以強制啓用檢查更改事件?

回答

0

我自己沒有測試過這個,但是當你調用你的'DisableAllDataGridCheckBoxes'方法時,你需要禁用已經檢查過的複選框嗎? 如果不是,您可以傳遞調用複選框的ID,然後只禁用所有其他複選框。

chk.Attributes.Add("onclick", "alert('fired ...');DisableAllDataGridCheckBoxes(" + chk.ClientId + ");") 

我想這會允許服務器端代碼觸發。

+0

嗨安迪 - 是的複選框被選中也需要被禁用。 – 2009-02-10 19:35:01

-1

可能的解決方法是在數據網格的RowCommand的服務器端代碼中執行所有這些操作。

(張貼在C#中的樣品,但不會在VB我希望太大的不同)

protected void myGrid_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    if(((CheckBox)e.Item.FindControl("chkItemChecked")).Checked) 
    { 
     foreach(GridViewRow dvRow in myGrid.Rows) 
      ((CheckBox)dvRow.FindControl("chkItemChecked")).Enabled = false; 
    } 
} 

或者你可以使用

((CheckBox)e.Item.FindControl("chkItemChecked")).Enabled = false; 

如果只想禁用特定項目。

但是,如果你只想在客戶端代碼中實現這一點,它不會幫助你。

+0

需要成爲客戶端。 – 2009-02-10 19:35:43

0

服務器端事件未觸發的原因是禁用的複選框不會與表單的其餘部分一起獲取。

我使用的解決方法是將複選框的onclick事件設置爲null,而不是禁用它們 - 雖然這不會給用戶留下任何視覺線索,以致後續點擊被忽略,但確實會阻止雙重提交,並且檢查當響應被呈現時,框被設置爲正確的狀態。

0

而不是禁用複選框(然後不提交),只是「防止」他們被選中。通過更改他們的onclick處理程序來重置檢查狀態來實現這一點。您可以將所有其他複選框設置爲禁用,並只爲正在處理的複選框執行此操作。就像:

function stopChanges(cbCurrent) { 
    $('INPUT[type=checkbox]').disable(); // disable all checkboxes 

    $(cbCurrent) 
     .disable(false) // enable this checkbox, so it's part of form submit 
     .click(function() { 
      // reset to previous checked - effectively preventing change 
      $(this).checked = !$(this).checked; 
     } 
    ); 
}