2013-07-11 5 views
27

असल में पोस्टबैक के बाद डेटा को खोने नियंत्रण, मैं Pageload पर 1 TextBox बनाना रहा हूँ और कि TextBoxPanel को जोड़ने। अब, मेरे पास LinkButton है जैसे Add Anotherडायनामिक रूप से तैयार

मैं TextBox में टेक्स्ट दर्ज कर रहा हूं और यदि आवश्यक हो तो मुझे Add Another LinkButton पर क्लिक करके नया TextBox बनाना होगा।

असल में, मैं गिनती प्राप्त करने और TextBoxes को फिर से बनाने में सक्षम हूं। लेकिन, समस्या यह है कि, पिछली जेनरेटेड Textboxes में मेरा दर्ज टेक्स्ट गुम है।

क्या कोई भी मुझे इस के लिए समाधान सुझा सकता है?

protected void Page_Load(object sender, EventArgs e) 
    { 
     try 
     { 
      if (!IsPostBack) 
      { 
       for (int i = 0; i < 5; i++) 
       { 
        TableRow row = new TableRow(); 
        for (int j = 0; j < 5; j++) 
        { 
         TableCell cell = new TableCell(); 
         TextBox tb = new TextBox();       
         tb.ID = "TextBoxRow_" + i + "Col_" + j;       
         cell.Controls.Add(tb);       
         row.Cells.Add(cell); 
        }      
        Table1.Rows.Add(row); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      throw; 
     }   
    } 

यह एक नमूना कोड है, एक ही कोड Button_Click इसके अलावा

protected void ASPxButton1_Click(object sender, EventArgs e) 
    { 
int k = Table1.Controls.Count; 
} 

में लिखा है मैं एक Count=0Button_Click पर हो रही है।

+1

क्या आप हमें कुछ कोड दिखा सकते हैं? –

उत्तर

3

इस गतिशील के साथ एक बहुत काम करने के बाद मेरी अंतिम जवाब को नियंत्रित करता है

.aspx

<form id="form1" runat="server"> 
<asp:ScriptManager ID="ScriptManager1" runat="server"> 
</asp:ScriptManager> 
<div style="text-align: center"> 
    <div style="background-color: Aqua; width: 250px;"> 
    <br /> 
    <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
      <asp:PlaceHolder runat="server" ID="myPlaceHolder"></asp:PlaceHolder> 
     </ContentTemplate> 
     <Triggers> 
      <asp:AsyncPostBackTrigger ControlID="btnAddTextBox" EventName="Click" /> 
     </Triggers> 
    </asp:UpdatePanel> 
    <br /> 
    </div> 
    <br /> 
    <asp:Button ID="btnAddTextBox" runat="server" Text="Add TextBox" OnClick="btnAddTextBox_Click" /> 
    <br /><br /> 
    <asp:UpdatePanel ID="UpdatePanel2" runat="server"> 
     <ContentTemplate> 
      <asp:Button runat="server" ID="MyButton" Text="Get Values." OnClick="MyButton_Click" /> 
      <br /><br /> 
      <asp:Label runat="server" ID="MyLabel"></asp:Label> 
     </ContentTemplate> 
    </asp:UpdatePanel> 
</div> 
</form> 

.aspx.cs

static int myCount = 0; 
    private TextBox[] dynamicTextBoxes; 

    protected void Page_PreInit(object sender, EventArgs e) 
    { 
     Control myControl = GetPostBackControl(this.Page); 

     if ((myControl != null)) 
     { 
      if ((myControl.ClientID.ToString() == "btnAddTextBox")) 
      { 
       myCount = myCount + 1; 
      } 
     } 
    } 

    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     dynamicTextBoxes = new TextBox[myCount]; 
     int i; 
     for (i = 0; i < myCount; i += 1) 
     { 
      TextBox textBox = new TextBox(); 
      textBox.ID = "myTextBox" + i.ToString(); 
      myPlaceHolder.Controls.Add(textBox); 
      dynamicTextBoxes[i] = textBox; 
      LiteralControl literalBreak = new LiteralControl("<br />"); 
      myPlaceHolder.Controls.Add(literalBreak); 
     } 
    } 

    protected void btnAddTextBox_Click(object sender, EventArgs e) 
    { 
     // Handled in preInit due to event sequencing. 
    } 

    protected void MyButton_Click(object sender, EventArgs e) 
    { 
     MyLabel.Text = ""; 
     foreach (TextBox tb in dynamicTextBoxes) 
     { 
      MyLabel.Text += tb.Text + " :: "; 
     } 
    } 

    public static Control GetPostBackControl(Page thePage) 
    { 
     Control myControl = null; 
     string ctrlName = thePage.Request.Params.Get("__EVENTTARGET"); 
     if (((ctrlName != null) & (ctrlName != string.Empty))) 
     { 
      myControl = thePage.FindControl(ctrlName); 
     } 
     else 
     { 
      foreach (string Item in thePage.Request.Form) 
      { 
       Control c = thePage.FindControl(Item); 
       if (((c) is System.Web.UI.WebControls.Button)) 
       { 
        myControl = c; 
       } 
      } 
     } 
     return myControl; 
    } 
6

गतिशील रूप से जेनरेट किया गया नियंत्रण राज्य को बनाए रखता नहीं है। आपको इसे अपने आप बनाए रखना है। आप नियंत्रण की स्थिति को बनाए रखने के लिए कुछ छिपे हुए क्षेत्र का उपयोग कर सकते हैं, जो राज्य को निकालने के लिए सर्वर पक्ष पर उपयोग किया जाएगा। अनुरोध के बीच राज्य को बनाए रखने के लिए Asp.net छिपे हुए क्षेत्र का उपयोग करता है, आप स्रोत में __VIEWSTATE देख सकते हैं।

एएसपी.नेट पृष्ठों में, दृश्य स्थिति पृष्ठ की स्थिति का प्रतिनिधित्व करती है जब यह सर्वर पर अंतिम संसाधित किया गया था। इसका उपयोग कॉल संदर्भ बनाने के लिए किया जाता है और उसी पृष्ठ के दो लगातार अनुरोधों में मान बनाए रखता है। डिफ़ॉल्ट रूप से, पृष्ठ को पृष्ठ पर जोड़े गए छिपे हुए फ़ील्ड का उपयोग करके क्लाइंट पर जारी रखा जाता है और पृष्ठ अनुरोध संसाधित होने से पहले सर्वर पर पुनर्स्थापित किया जाता है। व्यू स्टेटस पृष्ठ के साथ आगे और आगे यात्रा करता है, लेकिन क्लाइंट-साइड पेज डिस्प्ले, Reference से प्रासंगिक किसी भी जानकारी का प्रतिनिधित्व या प्रतिनिधित्व नहीं करता है।

+0

यह सच है जब स्वयं द्वारा उपयोग किया जाता है, लेकिन यदि आप प्लेसहोल्डर (या वैकल्पिक वेबकंट्रोल) पर गतिशील रूप से बनाए गए नियंत्रण को जोड़ते हैं, तो यह गतिशील नियंत्रण की स्थिति को बनाए रखेगा। जब तक आप पेज लोड (या पहले) पर अपने गतिशील नियंत्रण को मनोरंजन करते हैं, तो पोस्टबैक पर भी, राज्य की जानकारी संरक्षित की जाएगी। – Radderz

13

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

तो, शर्त हटाएं:! IsPostback, ताकि जब भी पृष्ठ लोड हो, टेक्स्टबॉक्स नियंत्रण भी बनाया जाता है। PageLoad हैंडलर पूर्ण होने के बाद भी आपको टेक्स्ट बॉक्स का स्टेटस सहेजा जाएगा। [जाहिर है आपने व्यूस्टेट को अक्षम नहीं किया है !!! ]

उदाहरण:

protected void Page_Load(object sender, EventArgs e) 
{ 

    TextBox txtBox = new TextBox(); 
    // Assign some text and an ID so you can retrieve it later. 

    txtBox.ID = "newButton"; 
    PlaceHolder1.Controls.Add(txtBox); 

} 

अब यह चलाने के बाद, पाठ बॉक्स में कुछ भी लिख सकते हैं और देखते हैं जब आप किसी भी बटन पोस्टबैक का कारण बनता है पर क्लिक करें क्या होता है। टेक्स्ट बॉक्स ने अभी भी अपना राज्य बनाए रखा है !!!

+1

क्या आप व्यूस्टेट पर विस्तार कर सकते हैं और यह गतिशील नियंत्रण को कैसे प्रभावित करता है? – Zorgarath

+0

आपको आशीर्वाद! महान समाधान – ARNDG2

0

दरअसल, मैंने अपना कार्य पूरा करने के लिए जावास्क्रिप्ट का उपयोग किया है। और यह इस प्रकार है:

<form id="form1" runat="server" enctype="multipart/form-data" method="post"> 
     <span style="font-family: Arial">Click to add files</span>&nbsp;&nbsp; 
     <input id="Button1" type="button" value="add" onclick="AddFileUpload()" /> 
     <br /> 
     <br /> 
     <div id="FileUploadContainer"> 
      <!--FileUpload Controls will be added here --> 
     </div> 
     <asp:HiddenField ID="HdFirst1" runat="server" Value="" /> 
     <br /> 
     <asp:Button ID="btnUpload" runat="server" Text="Upload" OnClick="btnUpload_Click" /> 
    </form> 

स्क्रिप्ट:

<script type="text/javascript"> 
     var counter = 0; 

     function AddFileUpload() { 

      var div = document.createElement('DIV'); 
      div.innerHTML = '<input id="file' + counter + '"name = "file' + counter + '"type="text"/><input id="file' + counter + '" name = "file' + counter + '" type="file" /><input id="Button' + counter + '" type="button" value="Remove" onclick = "RemoveFileUpload(this)" />'; 

      document.getElementById("FileUploadContainer").appendChild(div); 
      counter++; 
     } 
     function RemoveFileUpload(div) { 
      document.getElementById("FileUploadContainer").removeChild(div.parentNode); 
     } 

     function mydetails(div) { 
      var info; 
      for (var i = 0; i < counter; i++) { 
       var dd = document.getElementById('file' + i).value; 
       info = info + "~" + dd; 
      } 
      document.getElementById('<%= HdFirst1.ClientID %>').value = info; 
     } 
    </script> 

और Upload_Click बटन में:

for (int i = 0; i < Request.Files.Count; i++) 
     {   
      string strname = HdFirst1.Value; 
      string[] txtval = strname.Split('~'); 
      HttpPostedFile PostedFile = Request.Files[i]; 
      if (PostedFile.ContentLength > 0) 
      { 
       string FileName = System.IO.Path.GetFileName(PostedFile.FileName); 
       // string textname= 
       //PostedFile.SaveAs(Server.MapPath("Files\\") + FileName); 
      } 
     } 
13

तुम सब करने की ज़रूरत फिर से इन्स्तांत/reinitialize गतिशील करने के लिए है पोस्टबैक के दौरान हर बार पेज लोड इवेंट के पहले या उसके भीतर नियंत्रण करता है और इस नियंत्रण को पेज/फॉर्म/प्लेसहोल्डर्स में जोड़ता है। फिर, पोस्ट किए गए डेटा को स्वचालित रूप से लोडपोस्टडेटा विधि को पैरेंट नियंत्रण द्वारा कॉल करके नियंत्रण में असाइन किया जाएगा।

जांच लेख और कैसे गतिशील नियंत्रण के लिए कोड लिखने के लिए - How to maintain dynamic control events, data during postback in asp.net

enter image description here

+0

अब मैं गतिशील नियंत्रण राज्य प्रबंधन धन्यवाद विवेक के बारे में स्पष्ट हूँ। विस्तृत सहायक लेख के लिए – Rohit

+0

+1। यह पोस्टबैक/घटनाओं के लिए गतिशील नियंत्रण की रेखांकित कार्यप्रणाली के लिए एक महान संदर्भ है। – Radderz

4

बस इस लाइन

if (!IsPostBack) 
0

आप गतिशील नियंत्रण के साथ काम कर रहे हैं जब हटाने वे बनाए रखने में सक्षम नहीं होगा इसकी पोस्टबैक के दौरान राज्य और उनके डेटा खो गए क्योंकि उनके पास डेटा को बनाए रखने के लिए कोई भी दृश्यमान नहीं है।

आपको केवल बनाए गए नियंत्रण डेटा को ViewState गतिशील रूप से बनाए रखने की आवश्यकता है और पोस्टबैक के समय पृष्ठ को डेटा लोड करता है और आप किए जाते हैं।

public Dictionary<Guid, string> UcList 
{ 
    get { return ViewState["MyUcIds"] != null ? (Dictionary<Guid, string>)ViewState["MyUcIds"] : new Dictionary<Guid, string>(); } 
    set { ViewState["MyUcIds"] = value; } 
} 

public void InitializeUC() 
{ 
    int index = 1; 
    foreach (var item in UcList) 
    { 
     var myUc = (UserControls_uc_MyUserControl)LoadControl("~/UserControls/uc_MyUserControl.ascx"); 
     myUc.ID = item.Value; 
     pnlMyUC.Controls.AddAt(index, myUc); 
     index++; 
    } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
     LoadControl(); 
    else 
     InitializeUC(); 
} 

यहां आप गतिशील नियंत्रण के लिए पोस्टबैक और पोस्टबैक के बारे में सबसे अच्छी समझ पा सकते हैं। Retain dynamic control values in every postback or event click

enter image description here

संबंधित मुद्दे