हां, यह संभव है। पूरी तरह से 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;
}
}
नियंत्रण * को * पोस्टबैक पर फिर से बनाया जाना चाहिए। हालांकि, इस कार्य को स्वचालित बनाने के लिए कुछ परियोजनाएं हैं, जैसे कि [डायनामिक कंट्रोलप्लेसहोल्डर] (http://www.denisbauer.com/ASPNETControls/DynamicControlsPlaceholder.aspx) (यह बनी रहती है और बाद में नियंत्रण फिर से बनाती है)। –
हाँ मैंने इसके बारे में पढ़ा है लेकिन मैं यह सामान सीखना चाहता हूं :) – Shaokan