0

シンプルなデータグリッドがあります。各行にはチェックボックスがあります。チェックボックスは autopostback に設定されており、コード ビハインドにはチェックボックスの check-changed イベントのイベント ハンドラーがあります。これはすべて期待どおりに機能し、複雑なことは何もありません。

ただし、チェックボックスがチェックされたらすぐにチェックボックスを無効にして、二重送信を防ぐ必要があります。つまり、チェックボックスがチェックされ、すべてのチェックボックスがクライアント側の 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" />

すべてが順番に表示されますが、サーバー側のイベントは発生しません。これは、チェックボックスが無効になっていることが原因であると考えられます。アラートをそのままにして、チェックボックスを無効にする呼び出しを削除すると、すべて正常に動作します。

チェックボックスが無効になっている場合でも、check-changed イベントを強制的に発生させることはできますか?

4

4 に答える 4

0

私はこれを自分でテストしていませんが、「DisableAllDataGridCheckBoxes」メソッドを呼び出すときに、チェックされているチェックボックスを無効にする必要がありますか? そうでない場合は、呼び出し元のチェックボックスの ID を渡してから、他のすべてのチェックボックスのみを無効にすることができます。

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

これにより、サーバー側のコードが起動できるようになると思います。

于 2009-02-10T10:56:13.163 に答える
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; 
       }
   );
}
于 2009-07-29T11:27:08.913 に答える
0

サーバー側のイベントが発生しない理由は、無効になっているチェックボックスがフォームの残りの部分と共に送信されないためです。

私が使用した回避策は、チェックボックスを無効にするのではなく、チェックボックスの onclick イベントを null に設定することです。これにより、その後のクリックが無視されるという視覚的な手がかりがユーザーに与えられませんが、二重送信が防止され、チェックボックスが一番上に設定されます。応答がレンダリングされたときの正しい状態。

于 2009-02-10T11:53:20.390 に答える
-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;

特定のアイテムのみを無効にしたい場合。

ただし、これをクライアント側のコードでのみ実装したい場合は、役に立ちません。

于 2009-02-10T11:08:18.377 に答える