2011-04-27 70 views
2

以下代碼塊允許用戶動態創建文本框控件。但是,在每次創建時,我想要添加一個刪除按鈕來刪除這個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 />")); 
      } 
     } 
    } 
} 

回答

1

我已經解決了這個問題。訣竅是使其不可見,而當用戶單擊刪除按鈕時,刪除控件。

0

我會建議您不要通過完全回發這樣做。 你最好只是隱藏它的客戶端與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

0

<asp:repeater>可能是你要搜索的內容。然後刪除按鈕的點擊處理程序將只是刪除父項(這將刪除整個重複元素),添加處理程序將添加另一個元素。

+0

我試過用直放站,但我無法在回發中保存文本框的值 – Shaokan 2011-04-28 10:02:59

+0

直放站有'runat = server'嗎?您還必須以不同方式訪問文本框(命名中繼器,然後使用函數或屬性檢索單個重複段) – Thebigcheeze 2011-04-28 15:26:53

1

如果你想與動態地添加和刪除ASP.NET控件玩,你必須閱讀它戴夫裏德的出色的和明確的文章:「Truly Understanding Dynamic Controls」。

如果您不瞭解涉及的問題 - 例如樹的控制必須完全重建每頁上的每一個請求的任務 - 那麼你正在註冊一個痛苦的世界。一旦你理解了這些問題,你將成爲一個更好的ASP.NET開發者(至少我是)。祝你好運! Keith

+0

感謝Keith在研究期間我已經閱讀過它們:) – Shaokan 2011-04-28 18:21:48

相關問題