ایجادکنترل دینامیک در ASP.Net
با سلام در این مقاله ایجاد کنترل TextBox پویا در asp.net را توضیح خواهیم داد . همچنین حفظ ارزش پیغام های پس زمینه و چگونگی بازبینی کنترل ها بر روی هر پسوند را توضیح می دهیم . علاوه بر این اتصال رویداد پویا به کنترل TextBox در asp.net را مورد بحث قرار می دهیم

برای شروع رویداد PreInit را به صفحه اضافه می کنیم و کد زیر را به آن اضافه می کنیم .
C #
Panel pnlTextBox;
protected void Page_PreInit(object sender, EventArgs e)
{
//Create a Dynamic Panel
pnlTextBox = new Panel();
pnlTextBox.ID = "pnlTextBox";
pnlTextBox.BorderWidth = 1;
pnlTextBox.Width = 300;
this.form1.Controls.Add(pnlTextBox);
//Create a LinkDynamic Button to Add TextBoxes
LinkButton btnAddtxt = new LinkButton();
btnAddtxt.ID = "btnAddTxt";
btnAddtxt.Text = "Add TextBox";
btnAddtxt.Click += new System.EventHandler(btnAdd_Click);
this.form1.Controls.Add(btnAddtxt);
//Recreate Controls
RecreateControls("txtDynamic", "TextBox");
}
VB.Net
Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreInit
'Create a Dynamic Panel
pnlTextBox = New Panel()
pnlTextBox.ID = "pnlTextBox"
pnlTextBox.BorderWidth = 1
pnlTextBox.Width = 300
Me.form1.Controls.Add(pnlTextBox)
'Create a LinkDynamic Button to Add TextBoxes
Dim btnAddtxt As New LinkButton()
btnAddtxt.ID = "btnAddtxt"
btnAddtxt.Text = "Add TextBox"
AddHandler btnAddtxt.Click, AddressOf btnAdd_Click
Me.form1.Controls.Add(btnAddtxt)
'Recreate Controls
RecreateControls("txtDynamic", "TextBox")
End Sub
همانطور که در بالا مشخص می کنید، کنترل های زیر را ایجاد کرده اید
1 ایجاد پنل پویا pnlTextBox واضافه کردن آن به کنترل فرم در صفحه
2. ایجاد LinkButton پویا btnAddTxt و پیوست به رویداد btnAdd_Click به آن واضافه کردن به کنترل فرم
3. ایجاد یک تابع به نام RecreateControls
در رویداد Click از LinkButton پویا، رویداد زیر را اضافه می کنیم
C #
protected void btnAdd_Click(object sender, EventArgs e)
{
int cnt = FindOccurence("txtDynamic");
CreateTextBox("txtDynamic-" + Convert.ToString(cnt + 1));
}
VB.Net
Protected Sub btnAdd_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim cnt As Integer = FindOccurence("txtDynamic")
CreateTextBox("txtDynamic-" & Convert.ToString(cnt + 1))
End Sub
دو عمل زیر را می خواهیم
1. FindOccurence
2. CreateTextBox
تابع FindOccurence به عنوان نام , وقوع TextBox پویا در مجموعه Request.Form است. ایده اصلی این است که شناسه داده شده یک الگوی معمول است که تمام شناسه ها از نوع txtDynamic هستند مانند txtDynamic-1، txtDynamic-2 و غیره.
C #
private int FindOccurence(string substr)
{
string reqstr = Request.Form.ToString();
return ((reqstr.Length - reqstr.Replace(substr, "").Length)
/ substr.Length);
}
VB.Net
Private Function FindOccurence(ByVal substr As String) As Integer
Dim reqstr As String = Request.Form.ToString()
Return ((reqstr.Length - reqstr.Replace(substr, "").Length) & _
/ substr.Length)
End Function
حالا CreateTextBox به عنوان نام برای ایجاد TextBox پویا استفاده می شود. این تابع ID را به عنوان پارامتر می پزیرد
C #
private void CreateTextBox(string ID)
{
TextBox txt = new TextBox();
txt.ID = ID;
txt.AutoPostBack = true;
txt.TextChanged += new EventHandler(OnTextChanged);
pnlTextBox.Controls.Add(txt);
Literal lt = new Literal();
lt.Text = "<br />";
pnlTextBox.Controls.Add(lt);
}
VB.Net
Private Sub CreateTextBox(ByVal ID As String)
Dim txt As New TextBox()
txt.ID = ID
txt.AutoPostBack = True
AddHandler txt.TextChanged, AddressOf OnTextChanged
pnlTextBox.Controls.Add(txt)
Dim lt As New Literal()
lt.Text = "<br />"
pnlTextBox.Controls.Add(lt)
End Sub
یک TextBox جدید ایجاد کرده و موارد را به آن اضافه می کنیم. سپس پیوستن TextChanged Event Handler و تنظیم ویژگی AutoPostBack به درستی انجام می شود. در نهایت آن را به پنل pnlTextBox اضافه می کنیم .
رویداد SelectedIndexChanged Handler در زیر داده شده است.
C #
protected void OnTextChanged(object sender, EventArgs e)
{
TextBox txt = (TextBox)sender;
string ID = txt.ID;
ClientScript.RegisterClientScriptBlock(this.GetType(), "Alert",
"<script type = 'text/javascript'>alert('" + ID +
" fired OnTextChanged event');</script>");
//Place the functionality here
}
VB.Net
Protected Sub OnTextChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim txt As TextBox = DirectCast(sender, TextBox)
Dim ID As String = txt.ID
'Place the functionality here
ClientScript.RegisterClientScriptBlock(Me.GetType(), _
"Alert", "<script type = 'text/javascript'>alert('" & ID _
& " fired OnTextChanged event');</script>")
End Sub
در رویداد فوق، شناسه Callback TextBox را براساس نوع Casting parametr Sender پیدا می کنیم و سپس آن را در یک هشدار جاوا اسکریپت نمایش میدهیم
همانطور که در شکل زیر نشان داده شده

در حال حاضر مهم ترین تابع RecreateControls است که کار آن بازسازی تمام TextBox را بر روی هر پسوند است
C #
private void RecreateControls(string ctrlPrefix, string ctrlType)
{
string[] ctrls = Request.Form.ToString().Split('&');
int cnt = FindOccurence(ctrlPrefix);
if (cnt > 0)
{
for (int k = 1; k <= cnt; k++)
{
for (int i = 0; i < ctrls.Length; i++)
{
if (ctrls[i].Contains(ctrlPrefix + "-" + k.ToString())
&& !ctrls[i].Contains("EVENTTARGET"))
{
string ctrlID = ctrls[i].Split('=')[0];
if (ctrlType == "TextBox")
{
CreateTextBox(ctrlID);
}
break;
}
}
}
}
}
VB.Net
Private Sub RecreateControls(ByVal ctrlPrefix As String, ByVal ctrlType As String)
Dim ctrls As String() = Request.Form.ToString().Split("&"c)
Dim cnt As Integer = FindOccurence(ctrlPrefix)
If cnt > 0 Then
For k As Integer = 1 To cnt
For i As Integer = 0 To ctrls.Length - 1
If ctrls(i).Contains((ctrlPrefix & "-") + k.ToString()) _
AndAlso Not ctrls(i).Contains("EVENTTARGET") Then
Dim ctrlID As String = ctrls(i).Split("="c)(0)
If ctrlType = "TextBox" Then
CreateTextBox(ctrlID)
End If
Exit For
End If
Next
Next
End If
End Sub
همانطور که در بالا ذکر شد، ابتدا یک رشته خاص در اینجا txtDynamic در مجموعه Request.Form پیدا میکنیم و سپس از طریق هر آیتم حلقه میکنیم و همچنان TextBox را با استفاده از تابع CreateTextBox نگهداری میکنیم.