0

データソースとして List (Of MyObject) を持つ gridview があります。

gv.DataSource = MyListObject
gv.Databind()

templatefield の下に、MyListObject からレコードを削除してから再バインドするように構成されたボタンがあります。レコードを追加するには、以下のコードがあります

Protected Sub btnAddRecord_Click(sender As Object, e As EventArgs) Handles btnAddRecord.Click
    Dim Customer As New Customer

    With Customer
        .Name = txtName.Text
        .Surname = txtSurname.Text
        .....
        .ID += MyListObject.Count
    End With

    MyListObject.Add(Customer)

    gv.DataSource = MyListObject 
    gv.DataBind()
End Sub

これは正常に機能しますが、必要に応じてユーザーがレコードを削除できるようにする必要があります。

Private Sub gv_RowCommand(sender As Object, e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gv.RowCommand
    If e.CommandName = "Delete" Then
        MyListObject.RemoveAt(e.CommandArgument)

        gv.DataSource = Nothing
        gv.DataBind()

        gv.DataSource = MyObjectList
        gv.DataBind()

        upnl.UpdateMode = UpdatePanelUpdateMode.Conditional
        upnl.Update()
    End If
End Sub

ボタンをクリックすると、レコードは削除されますが、データは更新されません。つまり、レコードが追加されると、ID を行 ID として割り当て、その ID を使用してレコードを削除します。List と Gridview の値が同期していないため、値をリセットして ID を正しいものにするために、データソースを何も設定せずに再バインドしますが、これは期待どおりに機能しません。

誰が間違っているのか、この問題を修正する方法を教えてもらえますか?

4

3 に答える 3

1

ですか?gridview_ updatepanelはいの場合、そのパネルも更新する必要があります。

于 2013-04-08T18:13:30.767 に答える
1

CommandArgument='<%# Container.DataItemIndex %>' を追加して、ユーザーがクリックした行を削除していたため、問題を解決しました。

于 2013-04-10T17:17:59.997 に答える
0

余談ですが、コードビハインドで行うのではなく、クライアント側で ajax スクリプトマネージャーを使用して更新されたものを処理することになるでしょう。頭痛を救います。上記は更新パネルを正しく更新している可能性がありますが、クライアント側に ajax 配管が存在しない可能性があります。

于 2013-04-08T18:59:09.670 に答える