AutoPostbackを使用したテンプレートのチェックボックス選択からのグリッドの行の決定
-
28-09-2019 - |
質問
チェックボックスであるテンプレートされたフィールド列を備えたDataBoundグリッドがあります。ユーザーがチェックボックスをチェックすると、ボックスのチェック状態を示すために行をオートポストバックして更新します。
私の最初の試みは、単にOnCheckedChangedメソッドを使用することでしたが、これが呼び出されると、チェックボックスがどの行から来たかを知る方法がありません。したがって、どの行を更新するかわかりません。
onCheckedChangedイベントを起動したチェックボックスを決定する方法を提案できますか?または、私がする必要があることを達成するためのより良い方法を提案できますか?
チェックボックスをデータ列にバインドすることはできません。なぜなら、チェックボックスを選択したモードで無効にしたくないため、ユーザーに編集モードの入力を要求して値を変更したくないからです。また、すべての行が編集可能である必要があります。したがって、最適なルートはテンプレートされた列にあるようです。
解決
行を繰り返すことで、チェックされたチェックボックスを見つけることができます。
Protected Sub MyCheckBoxCheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
For Each row As GridViewRow In GridView1.Rows
Dim cb As CheckBox = DirectCast(row.FindControl("MyCheckBoxID"), CheckBox)
If sender Is cb AndAlso cb.Checked Then
'Do something ...'
Exit For
End If
Next
End Sub
これは、ように見えるほど非効率的ではありません(グリッドのページサイズが高すぎない場合)。
また、チェックボックスを使用してGridViewRowを入手することもできます。Parent.Parent:
Protected Sub MyCheckBoxCheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim cb As CheckBox = DirectCast(sender, CheckBox)
Dim row As GridViewRow = DirectCast(cb.Parent.Parent, GridViewRow)
row.BackColor = DirectCast(IIf(cb.Checked, Color.Red, Color.White), Color)
End Sub
これはオプション1のように高速ですが、FEが将来テーブルにチェックボックスをネストする場合、これは調整なしでは機能しなくなります。
イベントハンドラーでは、多かれ少なかれ重要ではないため、通常はオプション1を好みます。
アップデート: :gridviewrowを介して取得します namingcontainer 別の(私の意見では、最良のことです)オプション:
Dim row As GridViewRow = DirectCast(cb.NamingContainer, GridViewRow)
これは、テーブルのような他のコントロール内にチェックボックスをネストする場合でも機能します。
他のヒント
私はこれを処理せずに述べたようにこれを行う方法がないと思います RowEditing
, RowUpdating
, 、 と RowCancelingEdit
イベント。
または、Aを追加することをお勧めします CommandField
に GridView
, 、 そのようです:
<asp:CommandField ShowSelectButton="true" />
gridview.selectedindexchangingを処理する必要があります。
void GridView_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
{
GridView.SelectedIndex = e.NewSelectedIndex;
}
あなたが入ったら SelectedIndexChanging
, 、使用できます GridView.Rows[e.NewSelectedIndex].FindControl("id")
必要なコントロールを取得するには、このファンシトン性がまだ重要であると仮定してください。
編集: 私はあなたのアップデートを読んだばかりで、あなたがここで何を達成しようとしているのか完全にはわかりません。あなたはに精通しているように聞こえます CommandField
. 。行を独立して行う必要があるこのチェックボックスをチェックするとき、あなたはあなたのウェブサイトに何をしたいですか?
編集2: キャストすることもできます object sender
あなたに CheckBox
, 、そして適切なものを見つけます GridRow
使用 .Parent()
, 、しかし、これはいつも私にとって非常にハッキーだと感じています。
編集3: 私は誓います、私は最終的にこれを編集するのをやめるつもりです。
私はこれを試したことがありませんが、あなたはへの参照を得ることができます CheckBox.ClientID
そして、gridviewの各行を通過して電話をかけてみてください GridViewRow.FindControl(CheckBox.ClientID)
. 。しかし、これがうまくいくかどうかは本当にわかりません。