1

私はここで少し立ち往生しています。(SomeObject の) Lit であるデータソースを持つデータリストがあります。

Private MyObjectList As List (of SomeObject)

ユーザーがボタンをクリックして商品をショッピング バスケットに追加し、データリストをバインドする必要があるときに、データをロードします。

Form_load....
dl.Datasource = MyObjectList
dl.databind()
End Sub

データリストにデータを表示するために、追加したものを示すラベルがあり、e eventArg を使用してオブジェクトにキャストします。以下の例:

Protected Sub dl_ItemDataBound(sender As Object, e As System.Web.UI.WebControls.DataListItemEventArgs) Handles dl.ItemDataBound
    Dim myObject = DirectCast(e.Item.DataItem, SomeObject)
....
Label.Text = myObject.Description

End Sub

インライン コードは次のとおりです。

    <asp:DataList ID="dl" runat="server">
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
                    <asp:Button ID="DeletePRoduct" runat="server" Text="Delete" CommandName="Del" CommandArgument='<%# Container.ItemIndex %>'/>
        </ItemTemplate>
    </asp:DataList>

だから今、私はユーザーが製品を削除できるようにしたいと思います

Protected Sub dl_ItemCommand(source As Object, e As System.Web.UI.WebControls.DataListCommandEventArgs) Handles dl.ItemCommand
    Dim myObject = DirectCast(e.Item.DataItem, SomeObject)

    If e.CommandName = "Del" Then
        MyObjectList.Remove(myObject)
    ....
    End If
End Sub

ItemCommand の下に myObject を渡そうとすると、キャストした e.item.DataItem が Nothing であるため、製品が削除されないことに気付きました。次に、行インデックスでその製品を削除することを考え、CommandArgument をボタンに追加しました。List は SomeObject のタイプを期待しているため、それができないことに気付きました。

この方法でオブジェクトを削除する方法を誰かアドバイスできますか?

ありがとう

4

2 に答える 2

1

を使用して削除アイテムの ID を見つけることができますdl.DataKeys[e.Item.ItemIndex]。コントロールの設定DataKeyFieldを確認してください。DataList

ここに画像の説明を入力

<asp:DataList ID="dl" runat="server" DataKeyField="ID"...>
 ....
</asp:DataList>

Public Class SomeObject
    Public Property ID() As Integer
        Get
            Return m_ID
        End Get
        Set
            m_ID = Value
        End Set
    End Property
    Private m_ID As Integer
    Public Property Name() As String
        Get
            Return m_Name
        End Get
        Set
            m_Name = Value
        End Set
    End Property
    Private m_Name As String
End Class

Private _someObjects As List(Of SomeObject)
Public Property SomeObjects() As List(Of SomeObject)
    Get
        If _someObjects Is Nothing Then
            _someObjects = New List(Of SomeObject)() With { _
                New SomeObject() With { _
                    .ID = 1, _
                    .Name = "One" _
                }, _
                New SomeObject() With { _
                    .ID = 2, _
                    .Name = "Two" _
                }, _
                New SomeObject() With { _
                    .ID = 2, _
                    .Name = "Three" _
                } _
            }
        End If
        Return _someObjects
    End Get
    Set
        SomeObjects = value
    End Set
End Property

Protected Sub Page_Load(sender As Object, e As System.EventArgs)
    If Not IsPostBack Then
        dl.DataSource = SomeObjects
        dl.DataBind()
    End If
End Sub

Protected Sub dl_ItemCommand(source As Object, e As DataListCommandEventArgs)
    If e.CommandName = "Del" Then
        Dim id = Convert.ToInt32(dl.DataKeys(e.Item.ItemIndex))
        Dim someObject = SomeObjects.First(Function(x) x.ID = id)
        SomeObjects.Remove(someObject)

        dl.DataSource = SomeObjects
        dl.DataBind()
    End If
End Sub

注:削除後のデータの永続化に注意する必要があります。たとえば、ViewState、Session、または Database にデータを格納します。

于 2013-04-24T16:24:52.450 に答える