坚持动态生成的控件.net

时间:2017-02-03 22:33:00

标签: asp.net vb.net postback

我想在单击按钮时添加一组新的.net控件和html标记。

此时我有一个占位符,我正在从VB.Net中的代码动态添加控件,它是正确的,但是,只要有回发(单击按钮或下拉列表更改其值)它们不会重新生成。 哪种维护这些元素的正确方法?

我在这些页面中进行了搜索(msdstackoverflow1 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

坦克帮忙!

3 个答案:

答案 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 控件来执行此操作。

一些可以提供帮助的链接: