asp.net ajax删除动态控件不更新页面

时间:2012-08-15 16:48:19

标签: asp.net ajax dynamic-controls

我有一个页面,用户可以在表单中添加多个电子邮件地址。 单击添加,通过ajax添加另一个动态文本框 单击“保存”会将值保存在文本框中,但如果有空白文本框,则我希望在保存时将其删除。

我有代码来重新发送它并看到控件不再位于占位符中,但页面似乎没有更新以显示此内容。

Private Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
    If(Not Page.IsPostBack)
        AddEmailAddressBoxesLoad()
    Else
         Dim button As Control = GetPostBackControl(Me.Page)

        If (button IsNot Nothing) Then
            If (button.ID = "btnAdd") Then
                AddEmailAddressBoxes()              
            ElseIf (button.ID.Contains("btnSave"))
                AddEmailAddressBoxesSave()
                RemoveTextBox()
            End If
        End If

    End If
End Sub



Public Function RemoveTextBox() As List(Of String)
    Dim emptyTextBoxList = New List(Of TextBox
                                    )
    For Each control As Control In phMultiEmailAddressBoxes.Controls
        If(TypeOf(control) Is TextBox)
            Dim textBox = CType(control, TextBox)
            If(String.IsNullOrEmpty(textBox.Text))                  
                emptyTextBoxList.Add(textBox)
            End If
        End If
    Next

    For Each textBox As TextBox In emptyTextBoxList
        phMultiEmailAddressBoxes.Controls.Remove(textBox)
    Next
End Sub

添加TextBox方法

Private Sub AddEmailAddressBoxes()
    Dim count As Integer

    If (ViewState("EmailAddressboxCount") IsNot Nothing)
        count = CType(ViewState("EmailAddressboxCount"), Integer)
    End If

    count = count + 1

    ViewState("EmailAddressboxCount") = count

    For i As Integer = 1 To count
        AddTextBox(i)
    Next
End Sub

Private Sub AddEmailAddressBoxesLoad()
    Dim count As Integer = 1

    If(TrustSettings.HREmailAddressList.Any())
        count = TrustSettings.HREmailAddressList.Count()
    End If

    ViewState("EmailAddressboxCount") = count

    For i As Integer = 1 To count
        AddTextBox(i)
    Next
End Sub

Private Sub AddTextBox(i As Integer)
    Dim divStart = new Literal()
    divStart.Text = "<div>"
    phMultiEmailAddressBoxes.Controls.Add(divStart)

    Dim textBox = New TextBox()
    textBox.ID = "txtEmailBox" + i.ToString()
    textBox.MaxLength = 200
    textBox.CssClass = "email"
    If(TrustSettings.HREmailAddressList.Any() And TrustSettings.HREmailAddressList.Count() >= i)
        textBox.Text = TrustSettings.HREmailAddressList(i-1)
    End If

    phMultiEmailAddressBoxes.Controls.Add(textBox)

    Dim divEnd = new Literal()
    divEnd.Text = "</div>"
    phMultiEmailAddressBoxes.Controls.Add(divEnd)
End Sub

更新面板标记

<asp:UpdatePanel runat="server" ID="UpdatePanel1">
    <ContentTemplate>
       <asp:PlaceHolder ID="phMultiEmailAddressBoxes" runat="server"></asp:PlaceHolder>
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="btnAdd" />
        <asp:AsyncPostBackTrigger ControlID="btnSave" />
    </Triggers>
</asp:UpdatePanel>

<asp:Button runat="server" ID="btnAdd" Text="Add new email address" CssClass="but_small_png" UseSubmitBehavior="False" />
<asp:Button runat="server" ID="btnSave" Text="Save" CssClass="but_small_png" UseSubmitBehavior="False" />

编辑:@Yuriy Rozhovetskiy的代码移植到VB

 protected sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load

        if (IsPostBack)
            for each value As String in DynamicTextBoxes
                Dim tb = new TextBox() with { .ID = value, .CssClass = "email" }
                phMultiEmailAddressBoxes.Controls.Add(tb)
            Next
        End If
    End Sub

private Property  DynamicTextBoxes() As List(Of string)
    Get
        Dim list = ViewState("DynamicTextBoxes")
            if (list Is Nothing)

                list = New List(Of string)()
                ViewState("DynamicTextBoxes") = list
            End If
            return list
    End Get
    Set

    End Set
End Property

protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
    AddHandler btnSave.Click, AddressOf btnSave_Click
    AddHandler btnAdd.Click, AddressOf btnAdd_Click
End Sub

Sub btnSave_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSave.Click
    For Each value As string In DynamicTextBoxes

        Dim tb = CType(phMultiEmailAddressBoxes.FindControl(value), TextBox)
        if (tb IsNot Nothing And string.IsNullOrEmpty(tb.Text))

            phMultiEmailAddressBoxes.Controls.Remove(tb)
            DynamicTextBoxes.Remove(value)
        End If
    Next
    End Sub

Sub btnAdd_Click(ByVal sender As Object, ByVal e As EventArgs)  Handles btnAdd.Click

    Dim value = "tbEmailAddress" + DynamicTextBoxes.Count.ToString()
    Dim tb = new TextBox() with { .ID = value, .CssClass = "email" }
    phMultiEmailAddressBoxes.Controls.Add(tb)
    DynamicTextBoxes.Add(id)
End Sub

1 个答案:

答案 0 :(得分:3)

不确定您的代码有什么问题,但下面的代码对我来说效果很好:

<asp:UpdatePanel runat="server">
     <ContentTemplate>
          <asp:TextBox runat="server" ID="tbDefaultEmailAddress" />
          <asp:Panel runat="server" ID="phMultiEmailAddressBoxes">
          </asp:Panel>
     </ContentTemplate>
     <Triggers>
          <asp:AsyncPostBackTrigger ControlID="btnSave" />
          <asp:AsyncPostBackTrigger ControlID="btnAdd" />
     </Triggers>
</asp:UpdatePanel>
<asp:Button runat="server" ID="btnAdd" Text="Add new email address" />
<asp:Button runat="server" ID="btnSave" Text="Save" />

private List<string> DynamicTextBoxes
{
    get
    {
        var list = ViewState["DynamicTextBoxes"] as List<string>;
        if (list == null)
        {
            list = new List<string>();
            ViewState["DynamicTextBoxes"] = list;
        }
        return list;
    }
}

protected void Page_Init(object sender, EventArgs e)
{
    btnAdd.Click += new EventHandler(btnAdd_Click);
    btnSave.Click += new EventHandler(btnSave_Click);
}

void btnSave_Click(object sender, EventArgs e)
{
    foreach (var id in DynamicTextBoxes.ToArray())
    {
        var tb = phMultiEmailAddressBoxes.FindControl(id) as TextBox;
        if (tb != null && string.IsNullOrEmpty(tb.Text))
        {
            phMultiEmailAddressBoxes.Controls.Remove(tb);
            DynamicTextBoxes.Remove(id);
        }
    }
}

void btnAdd_Click(object sender, EventArgs e)
{
    var id = "tbEmailAddress" + DynamicTextBoxes.Count.ToString();
    var tb = new TextBox() { ID = id, CssClass = "email" };
    phMultiEmailAddressBoxes.Controls.Add(tb);
    DynamicTextBoxes.Add(id);
}

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        foreach (var id in DynamicTextBoxes)
        {
            var tb = new TextBox() { ID = id, CssClass = "email" };
            phMultiEmailAddressBoxes.Controls.Add(tb);
        }
    }
}

特别是对于被迫使用VB.NET的兄弟:)

Private ReadOnly Property DynamicTextBoxes As List(Of String)
    Get
        Dim list As List(Of String) = TryCast(ViewState("DynamicTextBoxes"), List(Of String))
        If list Is Nothing Then
            list = New List(Of String)
            ViewState("DynamicTextBoxes") = list
        End If
        Return list
    End Get
End Property


Protected Sub Page_Load(ByVal sender As Object, ByVal evetArgs As EventArgs) Handles Me.Load
    If IsPostBack Then
        For Each id As String In DynamicTextBoxes
            AddNewTextBox(id)
        Next
    End If
End Sub

Protected Sub AddButton_Click(ByVal sender As Object, ByVal eventAtgs As EventArgs) Handles btnAdd.Click
    Dim id = "tbEmailAddress" & DynamicTextBoxes.Count.ToString()
    AddNewTextBox(id)
    DynamicTextBoxes.Add(id)
End Sub

Private Sub AddNewTextBox(ByVal id As String)
    Dim tb As TextBox = New TextBox
    tb.ID = id
    tb.CssClass = "email"
    phMultiEmailAddressBoxes.Controls.Add(tb)
End Sub

Protected Sub SaveButton_Click(ByVal sender As Object, ByVal evebtArgs As EventArgs) Handles btnSave.Click
    For Each id As String In DynamicTextBoxes.ToArray()
        Dim tb As TextBox = TryCast(phMultiEmailAddressBoxes.FindControl(id), TextBox)
        If Not tb Is Nothing AndAlso String.IsNullOrEmpty(tb.Text) Then
            phMultiEmailAddressBoxes.Controls.Remove(tb)
            DynamicTextBoxes.Remove(id)
        End If
    Next
End Sub

一个澄清为什么我使用字符串列表而不仅仅是添加文本框的数量:使用这种方法,您可以添加三个动态文本框,填充第一个和第三个但跳过第二个,所有都将按要求工作。