ASP.NET - 到中继器添加排在运行时 [英] ASP.NET - Add rows to repeater at runtime
问题描述
Public Partial Class _Default
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Page.IsPostBack = False Then
Dim ds1 As New List(Of Link)
For i = 1 To x
Dim h As New Link
ds1.Add(h)
h.Text = "ssss"
h.URL = "yyyyy"
Next
rptMenu.DataSource = (ds1)
Else
rptMenu.DataSource = ViewState("ds1")
End If
rptMenu.DataBind()
End Sub
Protected Sub addFeild()
Dim ds1 As List(Of Link) = rptMenu.DataSource
Dim h As New Link
ds1.Add(H)
rptMenu.DataBind()
End Sub
Private Sub Menu_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
ViewState("ds1") = rptMenu.DataSource
End Sub
End Class
<asp:Repeater ID="rptMenu" runat="server">
<ItemTemplate>
<tr>
<td><asp:TextBox CssClass="txtBox" ID="txtText" runat="server" Text='<%# Eval("Text") %>'></asp:TextBox></td>
<td><asp:TextBox CssClass="txtBox" ID="txtLocation" runat="server" Text='<%# Eval("URL") %>'></asp:TextBox></td>
<td><asp:Button ID="btnDelete" runat="server" Text="Delete" /></td>
</tr>
</ItemTemplate>
<FooterTemplate>
<tr><td colspan="3">
<asp:Button ID="btnAdd" runat="server" Text="Add" OnClick="addFeild" />
</td></tr></table>
</FooterTemplate>
</asp:Repeater>
这code增加了排whin我点击添加
This code adds row whin i click Add
但是,它会删除所有更改。
However, it removes all changes.
我怎样才能行添加到中继器无需拆卸变化?
推荐答案
要解决这个问题,我使用反射来确定什么是由转发
完成后它处理添加行本身,创建一个 ExtensibleRepeater
从转发
继承并允许为每个更新添加一行。它的唯一的问题是,因为添加的行,当它被更新页脚后会出现无法使用的页脚的概念。
To solve this issue I used Reflector to confirm what was done by the Repeater
when it handles adding rows itself, creating an ExtensibleRepeater
that inherits from Repeater
and allows one row to be added for each update. Its only issue is you can't use the footer concept because an added row appears after the footer when it is updated.
删除行通过设置来处理相关的可见
到假
。的RepeaterItem
Deleting a row is handled by setting the relevant RepeaterItem
's Visible
to False
.
IIRC你为什么回调数据丢失的原因是因为你调用的DataBind
甚至回调,复位所有的现有数据,包括用户的表单数据。
IIRC the reason why you're losing data on callback is because you're calling DataBind
even on callback, which resets all existing data, including user form data.
在code是专有的,但因为它是基于.NET 2.0 转发
,我可以告诉你一个修改版本的反射器的显示方式:
The code is proprietary, but as it is based upon Reflector's display of the .NET 2.0 Repeater
, I can show you an edited version:
Imports System.ComponentModel
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
'''======================================================================
''' Class: ExtensibleRepeater
'''
''' <summary>
''' A <see cref="Repeater" /> that can be extended by one item.
''' </summary>
'''
''' <remarks>
''' BUG: If the <see cref="ExtensibleRepeater.FooterTemplate" /> is defined, the additional
''' item will appear after it!
''' </remarks>
'''
''' <revisionhistory>
''' 100907 MEH Created based upon reflection on Repeater.
''' </revisionhistory>
'''======================================================================
<snip>
Public Class ExtensibleRepeater
Inherits Repeater
Private additionalItem As RepeaterItem
<snip>
'''---------------------------------------------------------------------
''' Function: AddNew
'''
''' <summary>
''' Adds another <see cref="RepeaterItem"></see> to the <see cref="ExtensibleRepeater"></see>.
''' </summary>
'''
''' <param name="ItemData">
''' The data item to associate with the <see cref="RepeaterItem"></see>.
''' Ignored if <paramref name="UseDataSource"></paramref> is False.
''' </param>
''' <param name="UseDataSource">
''' Indicates whether to use the specified data source.
''' </param>
'''
''' <returns>The new <see cref="System.Web.UI.WebControls.RepeaterItem"></see>.</returns>
'''
''' <exception cref="NotSupportedException">Called more than once.</exception>
'''
''' <remarks>
''' Currently can only be called once. Must be called again after
''' <see cref="DataBind"></see> is called to recreate the additional item.
''' </remarks>
'''
''' <revisionhistory>
''' 100907 MEH Created based upon reflection on the protected Repeater.CreateControlHierarchy.
''' </revisionhistory>
'''---------------------------------------------------------------------
Public Function AddNew(ByVal ItemData As Object, Optional ByVal UseDataSource As Boolean = True) As RepeaterItem
<snip>
If additionalItem IsNot Nothing Then _
Throw New NotSupportedException
<snip>
additionalItem = CreateItem(dataItemCount, itemType, UseDataSource, ItemData)
<snip>
Return additionalItem
End Function
'''---------------------------------------------------------------------
''' Property: Items
'''
''' <summary>
''' Gets a collection of <see cref="System.Web.UI.WebControls.RepeaterItem"></see>
''' objects in the <see cref="ExtensibleRepeater"></see>.
''' </summary>
'''
''' <returns>
''' A collection of <see cref="System.Web.UI.WebControls.RepeaterItem"></see>
''' objects. The default is an empty <see cref="System.Web.UI.WebControls.RepeaterItemCollection"></see>.
''' </returns>
'''
''' <remarks></remarks>
'''
''' <revisionhistory>
''' 100907 MEH Created.
''' </revisionhistory>
'''---------------------------------------------------------------------
<snip>
Public Overrides ReadOnly Property Items() As RepeaterItemCollection
Get
If additionalItem IsNot Nothing Then
Dim newItems As New ArrayList(MyBase.Items)
newItems.Add(additionalItem)
Return New RepeaterItemCollection(newItems)
End If
Return MyBase.Items
End Get
End Property
'''---------------------------------------------------------------------
''' Function: CreateItem
'''
''' <summary>
''' Creates a <see cref="System.Web.UI.WebControls.RepeaterItem"></see>
''' with the specified item type and location within the <see cref="ExtensibleRepeater"></see>.
''' </summary>
'''
''' <param name="ItemIndex">
''' The specified location within the <see cref="ExtensibleRepeater"></see>
''' to place the created item.
''' </param>
''' <param name="ItemType">
''' A <see cref="System.Web.UI.WebControls.ListItemType"></see> that
''' represents the specified type of the <see cref="T:System.Web.UI.WebControls.Repeater"></see>
''' item to create.
''' </param>
''' <param name="DataBind">
''' Indicates whether to use the specified data source.
''' </param>
''' <param name="DataItem">
''' The data item to associate with the <see cref="RepeaterItem"></see>.
''' Ignored if <paramref name="DataBind"></paramref> is False.
''' </param>
'''
''' <returns>The new <see cref="System.Web.UI.WebControls.RepeaterItem"></see>.</returns>
'''
''' <remarks></remarks>
'''
''' <revisionhistory>
''' 100907 MEH Created from reflection on the private Repeater.CreateItem, with no changes.
''' </revisionhistory>
'''---------------------------------------------------------------------
Private Overloads Function CreateItem(ByVal ItemIndex As Integer, ByVal ItemType As ListItemType, ByVal DataBind As Boolean, ByVal DataItem As Object) As RepeaterItem
<snip>
'''---------------------------------------------------------------------
''' Property: FooterTemplate
'''
''' <summary>
''' Gets or sets the <see cref="System.Web.UI.ITemplate" /> that
''' defines how the footer section of the <see cref="ExtensibleRepeater" />
''' control is displayed.
''' </summary>
'''
''' <value>
''' A <see cref="System.Web.UI.ITemplate" /> that defines how the
''' footer section of the <see cref="ExtensibleRepeater" /> control is
''' displayed.
''' The default value is Nothing.
''' </value>
'''
''' <remarks>
''' This property does not change the inherited behaviour. It is
''' only overridden to highlight this missing feature:
''' TODO: BUG: This will appear before an additional item if one is added.
''' </remarks>
'''
''' <revisionhistory>
''' 100907 MEH Created.
''' </revisionhistory>
'''---------------------------------------------------------------------
<Obsolete("BUG: This will appear before an additional item if one is added.")> _
<Description("The template used for the footer. BUG: This will appear before an additional item if one is added."), _
Browsable(False), DefaultValue(CStr(Nothing)), _
PersistenceMode(PersistenceMode.InnerProperty), _
TemplateContainer(GetType(RepeaterItem))> _
Public Overrides Property FooterTemplate() As ITemplate
<snip>
'''---------------------------------------------------------------------
''' Sub: DataBind
'''
''' <summary>
''' Binds the <see cref="ExtensibleRepeater"></see> control and all
''' its child controls to the specified data source.
''' </summary>
'''
''' <remarks>
''' <see cref="AddNew"></see> must be called again to restore the
''' additional item if it is needed.
''' </remarks>
'''
''' <revisionhistory>
''' 100908 MEH Created.
''' </revisionhistory>
'''---------------------------------------------------------------------
Overrides Sub DataBind()
additionalItem = Nothing
<snip>
End Class
这篇关于ASP.NET - 到中继器添加排在运行时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!