2

プログラムでデータソースを設定し、それをオブジェクトのコレクションにデータバインドするグリッドビューがあります。次に、作成された行ごとに、フィールドでさまざまなメソッドを使用して、次のようなオブジェクトから関連情報を抽出します。

<asp:TemplateField HeaderText="Aliases">
<ItemTemplate>
<%# ( (MyItem)Container.DataItem).Aliases.ToString() %>
</ItemTemplate>
</asp:TemplateField>

私の問題は、この方法では、 egまたは他の方法OnRowDeletingを使用してアクセスできるようにすることが望ましいということです。しかし、を保持するように構成する方法が見つかりません。使用済みにアクセスすることは可能ですか?それを行うためにどのように構成しますか?それが不可能な場合、メソッドによってバインドされている値にアクセスできますか?または、プランBを使用して、データソースオブジェクトコレクションをデータテーブルに書き換えてから、datakeysnamesを使用する必要がありますか?DataItemMyGridView.Rows[e.RowIndex].DataItemGridviewDataItemDataItem

4

2 に答える 2

5

MyGridView.Rows[e.RowIndex].DataItem一般的には機能するはずですが、ポストバックでグリッドデータを保持するためにビューステートに依存していると思います。このような場合、DataItemプロパティはNULLとして取得されます。

回避策は、ページのライフサイクルの早い段階で、各ポストバックの実際のデータでグリッドを常に再バインドすることです(たとえばpage_load)。

ただし、あなたの場合は、を非常にうまく使用できますDataKeyNames。あなたの考えに反して、このプロパティが機能するためにDataTableは必要ありません。たとえば、クラスにItemIdオブジェクトのキーを示す名前のプロパティがある場合DataKeyNames="ItemId"、マークアップで使用し、イベント引数のKeysOnRowDeletingプロパティを使用してそれを参照できます。

于 2011-08-17T10:18:29.507 に答える
1

MSDNによると:

「DataItemプロパティは、GridViewコントロールのRowDataBoundイベント中およびイベント後にのみ使用できます。」

したがって、RowDataBoundイベントのDataItemにアクセスします。

List(Of Vehicle)をグリッドにバインドするとします。

Dim vehicles As List(Of Vehicle) = Vehicle.GetAll()
gvVehicles.DataSource = vehicles
gvVehicles.DataBind()

RowDataBoundイベントで、DataItemにアクセスします。

Protected Sub gvVehicles_RowDataBound(sender As Object, e As GridViewRowEventArgs)

    If e.Row.RowType = DataControlRowType.DataRow Then
       Dim veh As Vehicle = TryCast(e.Row.DataItem, Vehicle)
       If Not veh Is Nothing Then
            Dim chkBox As CheckBox = CType(e.Row.FindControl("chkSelect"), CheckBox)
                chkBox.Checked = True
       End If
    End If
End Sub
于 2014-06-23T09:09:47.803 に答える