【问题标题】:persist dynamically generated controls .net坚持动态生成的控件.net
【发布时间】:2017-06-21 09:42:09
【问题描述】:

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

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

我在这些页面中搜索过(msdstackoverflow1stackoverflow2)但它只显示“如何添加”但没有“如何维护”控件 如果你能帮助我,下面是我的代码: 这是aspx:

<asp:PlaceHolder ID="reportFields" runat="server"></asp:PlaceHolder>

这是后面的代码:

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

坦克寻求帮助!

【问题讨论】:

  • 当你谈到食物或自然资源时,你应该使用“preserve”这个词。在软件中,我们使用“持久”、“维护”或“恢复”等词
  • @T.S.谢谢你的建议。对不起,我不是英语母语人士,但我一直在学习。拼写改变了

标签: asp.net vb.net postback


【解决方案1】:

Pre_Init 调用generateReportField() 方法,甚至为您的页面。您需要在每个回发中执行此操作,因为每个回发都使用页面类的全新实例,并且您需要在 Init 加载 ViewState 之前执行此操作阶段,否则 ViewState 将无法对这些控件正常工作。

【讨论】:

    【解决方案2】:

    我根据@Hammer125 的评论和我自己的研究找到了答案。 这都是关于使用 updatePanel 的。 这个链接应该对msdn. Using update panel in aspx有帮助。

    我创建了两个更新面板。第一个是用户设置新元素值的地方,第二个是显示这些值的地方。出于我的目的,我在这里使用了一个 gridview 来显示和处理生成的值。然而,这个 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
    

    我希望我已经很好地解释了自己,这对某人有帮助

    【讨论】:

      【解决方案3】:

      您可以通过添加部分回发来解决此问题,它只会刷新页面的一部分。这样,您可以请求对需要更改的页面部分进行更新,而让那些您不想要的页面保持原样。您可以使用 UpdatePanel 控件来做到这一点。

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

      【讨论】:

      • 它是关于动态创建的控件状态。
      猜你喜欢
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多