2011-04-26 17 views
7
<asp:Button onclick="Some_event" Text="Add TextBox" ID="id1" runat="server" /> 
//once clicked: 
<asp:TextBox ID="txt1" ......></asp:TextBox> 
//when clicked again: 
<asp:TextBox ID="txt1" ......></asp:TextBox> 
<asp:TextBox ID="txt2" ......></asp:TextBox> 
//and so on... 

गतिशील नियंत्रण बनाने का कोई तरीका है जो पोस्टबैक के बाद भी जारी रहेगा? दूसरे शब्दों में, जब उपयोगकर्ता बटन पर क्लिक करता है, तो एक नया टेक्स्टबॉक्स जेनरेट किया जाएगा और जब फिर से क्लिक किया जाता है तो पहला वाला तब तक रहेगा जबकि दूसरा एक उत्पन्न होगा। मैं एएसपीनेट का उपयोग करके यह कैसे कर सकता हूं? मुझे पता है कि अगर मैं पेज_इनिट ईवेंट में नियंत्रण बना सकता हूं तो वे बने रहेंगे लेकिन मुझे नहीं पता कि पेज_इनिट होने से पहले बटन को संभालना संभव है या नहीं, इसलिए एक और तरीका होना चाहिए।एएसपी.Net

+0

नियंत्रण * को * पोस्टबैक पर फिर से बनाया जाना चाहिए। हालांकि, इस कार्य को स्वचालित बनाने के लिए कुछ परियोजनाएं हैं, जैसे कि [डायनामिक कंट्रोलप्लेसहोल्डर] (http://www.denisbauer.com/ASPNETControls/DynamicControlsPlaceholder.aspx) (यह बनी रहती है और बाद में नियंत्रण फिर से बनाती है)। –

+0

हाँ मैंने इसके बारे में पढ़ा है लेकिन मैं यह सामान सीखना चाहता हूं :) – Shaokan

उत्तर

4

हां, यह संभव है। पूरी तरह से ASP.NET का उपयोग करके ऐसा करने का एक तरीका (जो आप जो पूछ रहे हैं उसके जैसा लगता है) TextBox नियंत्रणों की गिनती रखना होगा जो आपने जोड़ा है (उस मान को ViewState में संग्रहीत करना) और TextBox नियंत्रणों को फिर से बनाएं Page_Load घटना। बेशक, आजकल अधिकांश लोगों को शायद जावास्क्रिप्ट या jQuery इस कार्य को ग्राहक के पक्ष को संभालने के लिए प्रयोग करेंगे, लेकिन मैं एक साथ एक त्वरित उदाहरण प्रदर्शित करने के लिए डाल दिया है कि यह कैसे Postbacks साथ काम करता है:

पहला पन्ना:

<%@ 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 />")); 
      } 
     } 
    } 
} 

आप प्रत्येक पोस्टबैक पर नियंत्रण पुनः कर रहे हैं के बाद से, बक्सें में प्रवेश मान प्रत्येक पोस्टबैक भर में कायम की जाएगी। मैंने टेक्स्टबॉक्स से मूल्यों को पढ़ने के तरीके को तुरंत प्रदर्शित करने के लिए btnWriteValues_Click जोड़ा।

संपादित
मैं किसी पाठ बॉक्स और एक हटाएँ बटन से युक्त एक पैनल को जोड़ने के लिए उदाहरण अपडेट किया गया। यहां चाल यह है कि निकालें बटन कंटेनर पैनल को हटा नहीं देता है, यह केवल इसे दृश्यमान नहीं बनाता है। ऐसा इसलिए किया जाता है ताकि सभी नियंत्रण आईडी समान रहें, इसलिए प्रत्येक टेक्स्टबॉक्स के साथ दर्ज डेटा रहता है। अगर हम टेक्स्टबॉक्स को पूरी तरह से हटा रहे थे, तो हटाए गए टेक्स्टबॉक्स के बाद डेटा अगले पोस्टबैक पर एक टेक्स्टबॉक्स को स्थानांतरित कर देगा (अगर यह txt1, txt2 और txt3 है, तो हम इसे थोड़ा और स्पष्ट रूप से समझाएं, और हम txt2 को हटा दें, अगली पोस्टबैक पर हम दो टेक्स्टबॉक्स, txt1 और txt2 बनाएंगे, और txt3 में मौजूद मान खो जाएगा)।

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

    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 panel = control as Panel; 
      if (panel == null || !panel.Visible) continue; 
      foreach (var control2 in panel.Controls) 
      { 
       var textBox = control2 as TextBox; 
       if (textBox == null) continue; 
       Response.Write(string.Concat(textBox.Text, "<br />")); 
      } 
     } 
    } 

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

    private void AddTextBox(int index) 
    { 
     var panel = new Panel(); 
     panel.Controls.Add(new TextBox {ID = string.Concat("txtDynamic", index)}); 
     var btn = new Button { Text="Remove" }; 
     btn.Click += btnRemove_Click; 
     panel.Controls.Add(btn); 
     phControls.Controls.Add(panel); 
    } 

    private void btnRemove_Click(object sender, EventArgs e) 
    { 
     var btnRemove = sender as Button; 
     if (btnRemove == null) return; 
     btnRemove.Parent.Visible = false; 
    } 
} 
+0

बहुत दोस्त धन्यवाद !! यह वही है जिसे मैं देख रहा था! – Shaokan

+0

खुशी है कि मैं मदद कर सकता हूं। – rsbarro

+0

क्या मैं गतिशील टेक्स्टबॉक्स को हटाना चाहता हूं? जब भी कोई टेक्स्टबॉक्स बनाया जाता है तो मैं एक बटन डालता हूं और इसे एक ईवेंट असाइन करता हूं।असल में, पहले क्लिक पर टेक्स्टबॉक्स को सफलतापूर्वक हटाया जा रहा है, लेकिन फिर कुछ त्रुटियां हो सकती हैं (अपवाद नहीं, लेकिन उदाहरण के लिए पाठ्यपुस्तक का मूल्य क्लिक पर सहेजा नहीं जाता है)। निर्दिष्ट टेक्स्टबॉक्स को हटाने का कोई आसान तरीका है? – Shaokan

1

मैंने स्कॉट मिशेल द्वारा एक लेख पढ़ा जो बताता है कि व्यूस्टेट केवल पोस्ट-बैक में परिवर्तित नियंत्रण स्थिति बनी हुई है, न कि वास्तविक नियंत्रण स्वयं। मेरे पास आपका सटीक परिदृश्य नहीं था, लेकिन एक परियोजना जो मैं गतिशील रूप से जोड़े गए उपयोगकर्ता नियंत्रणों पर काम कर रहा था और मुझे उन्हें प्रत्येक पोस्टबैक में जोड़ना पड़ा। उस स्थिति में, इन्हें इनिट में बनाने के लिए अभी भी उपयोगी है ताकि वे अपना राज्य बनाए रख सकें। यहां लिंक है: Understanding ASP.NET View State। अनुभाग देखें "राज्य देखें और गतिशील रूप से जोड़े गए नियंत्रण"।

आपको जो भी नियंत्रण जोड़ रहे हैं उसका ट्रैक रखना पड़ सकता है (उदाहरण के लिए सत्र स्थिति में) और उन्हें पोस्ट बैक पर फिर से बनाएं। मैंने अभी एक छोटा परीक्षण किया है जहां मैं सत्र में सभी टेक्स्टबॉक्स आईडी के List<string> रखता हूं। पोस्टबैक पर, मैं सभी टेक्स्टबॉक्स को फिर से बना देता हूं।

+0

बहुत बहुत धन्यवाद! अनुमान है कि जब मैं छुट्टी में हूं तो मुझे पढ़ने के लिए बहुत कुछ है :) – Shaokan