0

リストを動的にププレートし、カスタム コントロールを使用する asp リピーターにバインドしたいと思います。

これが私のカスタム コントロール (.acsx ファイル) です。

<%@ Control Language="VB" ClassName="ControlCar" %>
<script runat="server">
    Private m_car As Car = Nothing
    Public Property Car() As Car
        Get
            Car= m_car
        End Get
        Set(ByVal value As Car)
            m_car = value
        End Set
    End Property
    
    Protected Sub Panel_OnLoad(ByVal sender As Object, ByVal e As System.EventArgs)
        If Me.m_car Is Nothing Then
            lit_color.Text = "(m_car Is Nothing)"
        Else
            lit_color.Text = "color of Me.m_car is (" & Me.m_car.Color & ")"
        End If
    End Sub
    
</script>

<asp:Panel ID="panel" OnLoad="Panel_OnLoad" runat="server">
    this is a car<br />
    color = <asp:Literal ID="lit_color" runat="server"></asp:Literal><br />
    <br />
</asp:Panel>

そこで、aspx ファイルにリピーターを作成します。

<%@ Register TagPrefix="uc" TagName="ControlCar" Src="myfile.ascx" %>
<asp:Repeater ID="id_repeater" runat="server">
    <headertemplate>
    </headertemplate>
    <itemtemplate>  
    <uc:ControlCar id="ControlCarTemplate" Car=<%# CType(Container.DataItem, Car)%> runat="server" />
    </itemtemplate>
</asp:Repeater>    

リピータを移入するリストが宣言されています:

Private Shared list_cars As ArrayList

LoadPage イベントで、リストに 1 つの項目を追加します。

If IsPostBack Then
    Return
End If

list_cars = New ArrayList()
Dim car As Car = New Car
car.Color = "red"
list_cars .Add(car)
id_repeater.DataSource = list_cars 
id_repeater.DataBind()

ページを表示すると、これが正しく表示されます:

これは車です

color = Me.m_car の色は (赤)

OK、ロードページイベントで正常に動作します

しかし今、ここで定義されたボタンクリックイベントにアイテムを追加したい:

Sub OnClickAdd(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim car = New Car
    car.Color = "blue"
    list_cars.Add(car)
    id_repeater_products.DataSource = list_cars
    id_repeater_products.DataBind()
End Sub

クリックイベントで、次のことがわかりました:

これは車です

color = (m_car はなし)

これは車です

color = (m_car はなし)

動作しません。Container.DataItem は Nothing 値だと思います。ページをロードするときだけの良いインスタンスです。

修正方法がわかりません。

4

1 に答える 1

0

Page_Loadで、Not Page.IsPostBack

If Not Page.IsPostBack Then

    list_cars = New ArrayList()
    Dim car As Car = New Car
    car.Color = "red"
    list_cars .Add(car)
    id_repeater.DataSource = list_cars 
    id_repeater.DataBind()

End If

ボタンをクリックするたびにポストバックが発生しlist_cars = New ArrayList()、Page_Loadでリストが上書きされます。

また、asp.netはWindowsアプリケーションではありません。リストをSessionまたはViewStateで保持しない限り、ポストバックのために既存のリストにアイテムを追加することはできません。

ページの後ろのコードにこのプロパティを追加します

Public Property list_cars As ArrayList

    Get
       If ViewState("list_cars") IsNot Nothing Then
          Dim list As ArrayList = CType(ViewState("list_cars"), ArrayList)
          return list
       End If

       return Nothing 'or return an empty list
    End Get

    Set
         ViewState("list_cars") = value
    End Set

End Property

これをページで使用するには:

Dim updatedList As ArrayList = list_cars
updatedList.Add(car)

list_cars = updatedList
于 2012-11-23T13:48:39.777 に答える