我想在单击按钮时添加一组新的.net控件和html标记。
此时我有一个占位符,我正在从VB.Net中的代码动态添加控件,它是正确的,但是,只要有回发(单击按钮或下拉列表更改其值)它们不会重新生成。 哪种维护这些元素的正确方法?
我在这些页面中进行了搜索(msd,stackoverflow1 stackoverflow2),但它只是显示“如何添加”但没有“如何维护”控件 如果你可以帮助我,下面是我的代码: 这是aspx:
<asp:PlaceHolder ID="reportFields" runat="server"></asp:PlaceHolder>
这是代码Behind:
Private Sub generatenewReportField(count As Integer)
reportFields.Controls.Add(New LiteralControl("<div class=""col-sm-12"">"))
'Name field
reportFields.Controls.Add(New LiteralControl("<div class=""form-group col-sm-3"">"))
reportFields.Controls.Add(New LiteralControl("<label for=""txtNewFieldName" & count & """>Name</label>"))
Dim tx1 As New TextBox()
tx1.CssClass = "form-control input-sm"
tx1.ID = "txtNewFieldName" & count
tx1.ToolTip = "New Field Name"
reportFields.Controls.Add(tx1)
reportFields.Controls.Add(New LiteralControl("</div>"))
'formula field
reportFields.Controls.Add(New LiteralControl("<div class=""form-group col-sm-3"">"))
reportFields.Controls.Add(New LiteralControl("<label for=""txtNewFieldFormula" & count & """>Formula</label>"))
Dim tx2 As New TextBox()
tx2.CssClass = "form-control input-sm"
tx2.ID = "txtNewFieldFormula" & count
tx2.ToolTip = "New Field Formula"
reportFields.Controls.Add(tx2)
reportFields.Controls.Add(New LiteralControl("</div>"))
'isKPI?
reportFields.Controls.Add(New LiteralControl("<div class=""form-group col-sm-2"">"))
reportFields.Controls.Add(New LiteralControl("<label for=""chkKPI" & count & """>Is KPI</label><br/>"))
Dim isKPI As New CheckBox
isKPI.CssClass = " switch input-sm"
isKPI.ID = "chkKPI" & count
initializeSwitch()
reportFields.Controls.Add(isKPI)
reportFields.Controls.Add(New LiteralControl("</div>"))
'KPI Weight
reportFields.Controls.Add(New LiteralControl("<div class=""form-group col-sm-3"">"))
reportFields.Controls.Add(New LiteralControl("<label for=""txtNewFieldKPIWeight" & count & """>Weight</label>"))
Dim tx3 As New TextBox()
tx3.CssClass = "form-control input-sm"
tx3.ID = "txtNewFieldKPIWeight" & count
reportFields.Controls.Add(tx3)
reportFields.Controls.Add(New LiteralControl("</div>"))
reportFields.Controls.Add(New LiteralControl("</div>"))
reportFields.Controls.Add(New LiteralControl("<br/>"))
End Sub
坦克帮忙!
答案 0 :(得分:1)
我找到了基于@ Hammer125评论和我自己研究的答案。 这都是关于使用updatePanel的。 此链接应该有助msdn. Using update panel in aspx。
我创建了两个更新面板。第一个是用户设置新元素值的位置,第二个是显示这些元素的位置。出于我的目的,我在这里使用gridview for show并处理生成的值。然而,这个gridview可以替换为任何需要的控件。此外,我还创建了一个具有我想要保存的属性的对象。
这是aspx。
<div class="col-md-12 well">
<asp:UpdatePanel ID="updPanelNewField" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<div class="col-sm-12">
<div class="form-group col-sm-3">
<label for="txtNewName">Name</label>
<asp:TextBox runat="server" ID="txtNewName" CssClass="form-control input-sm" ToolTip="Field's name"></asp:TextBox>
</div>
<div class="form-group col-sm-3">
<label for="txtNewFormula">Formula</label>
<asp:TextBox runat="server" ID="txtNewFormula" CssClass="form-control input-sm" ToolTip="Field's formula"></asp:TextBox>
</div>
<div class="form-group col-sm-2">
<label for="chkNewKPI">is KPI</label><br />
<asp:CheckBox runat="server" ID="chkNewKPI" CssClass="input-sm"/>
</div>
<div class="form-group col-sm-3">
<label for="txtNewWeight">KPI Weight</label>
<asp:TextBox runat="server" ID="txtNewWeight" CssClass="form-control input-sm" ToolTip="KPI's Weight (Remember don't pass 100% ;) ) "></asp:TextBox>
</div>
<div class="form-group col-sm-1 text-center" style="padding-left:1em; padding-top:1em">
<asp:Button runat="server" ID="addNewField" CssClass="btn btn-primary" Width="2em" Height="2em" Text="+" Font-Bold="true" Font-Size="Large" />
</div>
</div>
</ContentTemplate>
</asp:UpdatePanel>
<hr />
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:GridView ID="gdvFields" runat="server" CellPadding="1" GridLines="Horizontal">
<Columns>
<asp:BoundField DataField ="Id" HeaderText="ID"/>
<asp:BoundField DataField="Name" HeaderText="Name"/>
<asp:BoundField DataField="Formula" HeaderText="Formula" />
<asp:CommandField HeaderText="Options" CausesValidation="true" ShowDeleteButton="true" ShowEditButton="true"/>
</Columns>
<PagerSettings PageButtonCount="10" />
</asp:GridView>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="addNewField" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</div>
这是我在代码中添加的新类:
<Serializable()> _
Public Class ReportField
Private _id As Integer
Private _name As String
Private _formula As String
Sub New(fieldId As Integer, fieldName As String, fieldFormula As String)
_id = fieldId
_name = fieldName
_formula = fieldFormula
End Sub
Public Property id() As Integer
Get
Return _id
End Get
Set(ByVal value As Integer)
_id = value
End Set
End Property
Public Property name() As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property
Public Property formula() As String
Get
Return _formula
End Get
Set(ByVal value As String)
_formula = value
End Set
End Property
Private _isKPI As Boolean
Public Property isKPI() As Boolean
Get
Return _isKPI
End Get
Set(ByVal value As Boolean)
_isKPI = value
End Set
End Property
Private _KPIWeight As Integer
Public Property KPIWeight() As Integer
Get
Return _KPIWeight
End Get
Set(ByVal value As Integer)
_KPIWeight = value
End Set
End Property
End Class
这就是我工作的代码所在:
#Region "Variables"
Dim count As Integer
Private thisReportFieldsList As List(Of ReportField)
#End Region
#Region "Events"
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Try
If Not IsPostBack() Then
count = 1
thisReportFieldsList = New List(Of ReportField)
ViewState("reportFieldsList") = thisReportFieldsList
Else
thisReportFieldsList = CType(ViewState("reportFieldsList"), List(Of ReportField))
End If
gdvFields.DataSource = thisReportFieldsList
gdvFields.DataBind()
Catch ex As Exception
showError(ex.Message)
End Try
End Sub
Protected Sub addNewField_Click(sender As Object, e As EventArgs) Handles addNewField.Click
Try
If String.IsNullOrEmpty(txtNewName.Text) Or String.IsNullOrEmpty(txtNewFormula.Text) Then
showError("Please add at least the name and formula of the new field", "Field not added")
Return
End If
Dim id As Integer
If thisReportFieldsList.Count = 0 Then
id = 0
Else
id = thisReportFieldsList(thisReportFieldsList.Count - 1).id
End If
Dim fieldId As Integer = id + 1
Dim fieldName As String = Server.HtmlEncode(txtNewName.Text)
Dim fieldFormula As String = Server.HtmlEncode(txtNewFormula.Text)
txtNewName.Text = String.Empty
txtNewFormula.Text = String.Empty
thisReportFieldsList.Add(New ReportField(fieldId, fieldName, fieldFormula))
ViewState("reportFieldsList") = thisReportFieldsList
gdvFields.DataBind()
gdvFields.PageIndex = gdvFields.PageCount
Catch ex As Exception
showError(ex.Message)
End Try
End Sub
#End Region
我希望自己能够解释得很好,这对某人有帮助
答案 1 :(得分:1)
即使您的页面也可以从generateReportField()
调用Pre_Init
方法。您需要在每个回发上执行此操作,因为每个回发都使用页面类的全新实例,并且您需要在之前执行在Init上加载ViewState阶段,或ViewState不能正确地为这些控件工作。
答案 2 :(得分:-1)
您可以通过添加部分回发来解决问题,只会刷新部分页面。这样,您可以请求更新页面的一部分需要更改,并留下您不想要的方式。您可以使用 UpdatePanel 控件来执行此操作。
一些可以提供帮助的链接: