0

チェックボックスであるテンプレート化されたフィールド列を持つデータバインドされたグリッドがあります。ユーザーがチェックボックスをオンにすると、自動ポストバックされ、ボックスのチェック状態を示すために行が更新されます。

私の最初の試みは、単に OnCheckedChanged メソッドを使用することでしたが、これが呼び出されたときに、チェックボックスがどの行から来たのかを知る方法がありません。したがって、どの行を更新すればよいかわかりません。

oncheckedchanged イベントを発生させたチェックボックスがどの行から来たかを判断する方法を誰かが提案できますか? または、私がしなければならないことを達成するためのより良い方法を提案できますか?

選択モードでチェックボックスを無効にしたくないため、チェックボックスをデータ列にバインドできません。ユーザーが編集モードに入って値を変更する必要はありません。また、すべての行を編集可能にする必要があります。したがって、最適なルートはテンプレート化された列にあるようです。

4

2 に答える 2

1

行を繰り返すことで、チェックされたチェックボックスを見つけることができます。

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

これは見た目ほど非効率的ではありません(グリッドのPageSizeが高すぎない場合)。

Checkbox.Parent.ParentからGridViewRowを取得することもできます。

  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よりも高速ですが、将来チェックボックスをテーブルにネストする場合は、調整しないと機能しなくなります。

私は通常、オプション1を好みます。これは、イベントハンドラーでは、1ミリ秒程度は問題ではないためです。


更新: NamingContainerを介してGridViewRowを取得することは別の(私の意見では最良の)オプションです:

Dim row As GridViewRow = DirectCast(cb.NamingContainer, GridViewRow)

これは、テーブルなどの他のコントロール内にチェックボックスをネストする場合でも機能します。

于 2010-11-02T22:27:44.020 に答える
0

RowEditingRowUpdating、およびRowCancelingEditイベントを処理せずに、述べたようにこれを行う方法はないと思います。

または、次のように aCommandFieldを に追加することをお勧めします。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。行の状態とは別に実行する必要があるこのチェックボックスをオンにしたときに、Web サイトに何をさせたいですか?

編集 2:にキャストobject senderして、 を使用しCheckBoxて適切なものを見つけることもできますが、これは常に私にとって非常にハックだと感じていました。GridRow.Parent()

編集 3:誓って、最終的にこれの編集をやめるつもりです。

私はこれを試したことはありませんが、参照を取得してCheckBox.ClientID、GridView の各行を調べて、GridViewRow.FindControl(CheckBox.ClientID). ただし、これが機能するかどうかは本当にわかりません。

于 2010-11-02T22:38:42.333 に答える