我有一个页面,用户可以在表单中添加多个电子邮件地址。 单击添加,通过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
答案 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
一个澄清为什么我使用字符串列表而不仅仅是添加文本框的数量:使用这种方法,您可以添加三个动态文本框,填充第一个和第三个但跳过第二个,所有都将按要求工作。