【问题标题】:ASP vb.net : How to dynamically change list bound to repeaterASP vb.net:如何动态更改绑定到中继器的列表
【发布时间】:2012-11-23 13:38:26
【问题描述】:

我想动态生成一个列表,并将其绑定到使用自定义控件的 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 事件中,我在列表中添加一项:

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 的颜色是(红色)

好的,它在加载页面事件时工作正常

但是现在,我想在此处定义的按钮 clic 事件上添加项目:

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 没什么价值,只有在加载页面时才是好实例

我不知道如何解决它,有什么帮助吗?

【问题讨论】:

  • 如果您不想在所有请求之间共享​​>此对象,切勿在 ASP.NET 中使用Shared。更好的是,永远不要在 ASP.NET 中使用 Shared
  • @Tim Schmelter 我需要使用 Shared,因为在单击按钮事件中,如果我不使用它,我的列表会重新创建并为空 shared 并且经常使用 Shared,当它很好用时。根本不用,是不懂。
  • 那是因为所有对象都被放置在每个页面的生命周期中。但与其共享,不如重新加载或使用ViewState/Session
  • @Tim Schmelter 好的,但它对动态中继器填充没有帮助

标签: asp.net vb.net dynamic repeater itemtemplate


【解决方案1】:

在您的 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

每当您单击该按钮时,都会发生回发,并且列表会被 Page_Load 中的list_cars = New ArrayList() 覆盖。

而且,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

【讨论】:

  • 对不起,我没有提到,我已经做到了。我编辑我的原始帖子以完成。
  • 我尝试使用 ViewState 变量,但问题是我在加载页面事件后得到点击按钮事件,所以我的数组列表没有因加载页面事件而改变,中继器也没有改变......跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多