如何在asp.net中删除动态创建的文本框?

问题描述:

以下代码块允许用户动态创建文本框控件。但是,在每次创建时,我想要添加一个删除按钮来删除这个speficied文本框。我知道我可以通过在创建文本框时添加按钮控件并将事件分配给相关按钮来完成此操作。但是,这种行为会导致不方便的情况,例如当您删除文本框时,它有时会删除最后一个文本框,有时会成功执行。我的问题是如何在创建的每个文本框附近添加一个按钮,以便让用户在保留所有其他动态控件的同时移除创建的控件?如何在asp.net中删除动态创建的文本框?

头版:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DynamicControls.aspx.cs" Inherits="MyAspnetApp.DynamicControls" EnableViewState="true" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"></head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:Button ID="btnAddTextBox" runat="server" Text="Add" OnClick="btnAddTextBox_Click" /> 
     <asp:Button ID="btnWriteValues" runat="server" Text="Write" OnClick="btnWriteValues_Click" /> 
     <asp:PlaceHolder ID="phControls" runat="server" /> 
    </div> 
    </form> 
</body> 
</html> 

后面的代码:

using System; 
using System.Web.UI.WebControls; 

namespace MyAspnetApp 
{ 
    public partial class DynamicControls : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      //Recreate textbox controls 
      if(Page.IsPostBack) 
      { 
       for (var i = 0; i < TextBoxCount; i++) 
        AddTextBox(i); 
      } 
     } 

     private int TextBoxCount 
     { 
      get 
      { 
       var count = ViewState["txtBoxCount"]; 
       return (count == null) ? 0 : (int) count; 
      } 
      set { ViewState["txtBoxCount"] = value; } 
     } 

     private void AddTextBox(int index) 
     { 
      var txt = new TextBox {ID = string.Concat("txtDynamic", index)}; 
      txt.Style.Add("display", "block"); 
      phControls.Controls.Add(txt); 
     } 

     protected void btnAddTextBox_Click(object sender, EventArgs e) 
     { 
      AddTextBox(TextBoxCount); 
      TextBoxCount++; 
     } 

     protected void btnWriteValues_Click(object sender, EventArgs e) 
     { 
      foreach(var control in phControls.Controls) 
      { 
       var textBox = control as TextBox; 
       if (textBox == null) continue; 
       Response.Write(string.Concat(textBox.Text, "<br />")); 
      } 
     } 
    } 
} 

我已经解决了这个问题。诀窍是使其不可见,而当用户单击删除按钮时,删除控件。

我会建议您不要通过完全回发这样做。 你最好只是隐藏它的客户端与Javascript。

如果您需要保存一些“状态”服务器端,请使用AJAX回发AKA XHR与服务器进行通信。 (我只是恨页轻拂LOL)

顺便说一句,这是这种东西完美FWK: http://examples.ext.net/#/Events/DirectMethods/Overview/

+0

那么,我希望它能够与那些非JavaScript的浏览器一起工作,再加上我想学习一些东西:)否则,用javascript做它会很容易,而且我会在页面完全工作时包含javascript w/o js :)不管怎样,你为什么不推荐? – Shaokan 2011-04-28 10:02:25

+0

即使是移动的,目前也支持JavaScript。回传重新加载整个页面。因此,将一些工作负载从服务器移动到客户端会更加明智。 – 2011-04-28 10:56:57

<asp:repeater>可能是你要搜索的内容。然后删除按钮的点击处理程序将只是删除父项(这将删除整个重复元素),添加处理程序将添加另一个元素。

+0

我试过用直放站,但我无法在回发中保存文本框的值 – Shaokan 2011-04-28 10:02:59

+0

直放站有'runat = server'吗?您还必须以不同方式访问文本框(命名中继器,然后使用函数或属性检索单个重复段) – Thebigcheeze 2011-04-28 15:26:53

如果你想与动态地添加和删除ASP.NET控件玩,你必须阅读它戴夫里德的出色的和明确的文章:“Truly Understanding Dynamic Controls”。

如果您不了解涉及的问题 - 例如树的控制必须完全重建每页上的每一个请求的任务 - 那么你正在注册一个痛苦的世界。一旦你理解了这些问题,你将成为一个更好的ASP.NET开发者(至少我是)。祝你好运! Keith

+0

感谢Keith在研究期间我已经阅读过它们:) – Shaokan 2011-04-28 18:21:48