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

برای شروع از یک رویداد PreInit را به صفحه اضافه کرده و کد زیر را به آن اضافه می کنیم .
C #
Panel pnlDropDownList;
protected void Page_PreInit(object sender, EventArgs e)
{
//Create a Dynamic Panel
pnlDropDownList = new Panel();
pnlDropDownList.ID = "pnlDropDownList";
pnlDropDownList.BorderWidth = 1;
pnlDropDownList.Width = 300;
this.form1.Controls.Add(pnlDropDownList);
//Create a LinkDynamic Button to Add TextBoxes
LinkButton btnAddDdl = new LinkButton();
btnAddDdl.ID = "btnAddDdl";
btnAddDdl.Text = "Add DropDownList";
btnAddDdl.Click += new System.EventHandler(btnAdd_Click);
this.form1.Controls.Add(btnAddDdl);
//Recreate Controls
RecreateControls("ddlDynamic", "DropDownList");
}
VB.Net
Private pnlDropDownList As Panel
Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreInit 'Create a Dynamic Panel
pnlDropDownList = New Panel()
pnlDropDownList.ID = "pnlDropDownList"
pnlDropDownList.BorderWidth = 1
pnlDropDownList.Width = 300
Me.form1.Controls.Add(pnlDropDownList)
'Create a LinkDynamic Button to Add TextBoxes
Dim btnAddDdl As New LinkButton()
btnAddDdl.ID = "btnAddDdl"
btnAddDdl.Text = "Add DropDownList"
AddHandler btnAddDdl.Click, AddressOf btnAdd_Click
Me.form1.Controls.Add(btnAddDdl)
'Recreate Controls
RecreateControls("ddlDynamic", "DropDownList")
End Sub
در بالا کنترل های زیر را ایجاد کرده ایم :
1 ایجاد پنل پویا pnlDropDownList و اضافه کردن آن به کنترل فرم در صفحه
2. ایجاد LinkButton btnAddDdl پویا و پیوست btnAdd_Click به آن و اضافه کردن به کنترل فرم .
3. ایجاد یک تابع به نام RecreateControls
در رویداد Click از LinkButton پویا، رویداد زیر را اضافه می کنیم .
C #
protected void btnAdd_Click(object sender, EventArgs e)
{
int cnt = FindOccurence("ddlDynamic");
CreateDropDownList("ddlDynamic-" + Convert.ToString(cnt + 1));
}
VB.Net
Protected Sub btnAdd_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim cnt As Integer = FindOccurence("ddlDynamic")
CreateDropDownList("ddlDynamic-" & Convert.ToString(cnt + 1))
End Sub
همانطور که متوجه شدید، دو عمل زیر را می خواهیم :
1. FindOccurence
2. CreateDropDownList
تابع FindOccurence به عنوان نام است و DropDownList پویا در مجموعه 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
حالا CreateDropDownList به عنوان نام برای ایجاد DropDownList پویا استفاده می شودو این تابع ID را به عنوان پارامتر پذیرش می کند
C #
private void CreateDropDownList(string ID)
{
DropDownList ddl = new DropDownList();
ddl.ID = ID;
ddl.Items.Add(new ListItem("--Select--", ""));
ddl.Items.Add(new ListItem("One", "1"));
ddl.Items.Add(new ListItem("Two", "2"));
ddl.Items.Add(new ListItem("Three", "3"));
ddl.AutoPostBack = true;
ddl.SelectedIndexChanged += new EventHandler(OnSelectedIndexChanged);
pnlDropDownList.Controls.Add(ddl);
Literal lt = new Literal();
lt.Text = "<br />";
pnlDropDownList.Controls.Add(lt);
}
VB.Net
Private Sub CreateDropDownList(ByVal ID As String)
Dim ddl As New DropDownList()
ddl.ID = ID
ddl.Items.Add(New ListItem("--Select--", ""))
ddl.Items.Add(New ListItem("One", "1"))
ddl.Items.Add(New ListItem("Two", "2"))
ddl.Items.Add(New ListItem("Three", "3"))
ddl.AutoPostBack = True
AddHandler ddl.SelectedIndexChanged, AddressOf OnSelectedIndexChanged
pnlDropDownList.Controls.Add(ddl)
Dim lt As New Literal()
lt.Text = "<br />"
pnlDropDownList.Controls.Add(lt)
End Sub
پس از ایجاد یک DropDownList جدید و اضافه کردن موارد ، آن را به رویداد Handler SelectedIndexChanged پیوست کرده و ویژگی AutoPostBack را تنظیم می کنیم . و در نهایت آن را به پنل pnlDropDownList اضافه می کنیم
رویداد SelectedIndexChanged در زیر داده شده است.
C #
protected void OnSelectedIndexChanged(object sender, EventArgs e)
{
DropDownList ddl = (DropDownList)sender;
string ID = ddl.ID;
ClientScript.RegisterClientScriptBlock(this.GetType(), "Alert",
"<script type = 'text/javascript'>alert('" + ID +
" fired SelectedIndexChanged event');</script>");
//Place the functionality here
}
VB.Net
Protected Sub OnSelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim ddl As DropDownList = DirectCast(sender, DropDownList)
Dim ID As String = ddl.ID
'Place the functionality here
ClientScript.RegisterClientScriptBlock(Me.GetType(), _
"Alert", "<script type = 'text/javascript'>alert('" & ID _
& " fired SelectedIndexChanged event');</script>")
End Sub

در حال حاضر تابع RecreateControls مهمترین است که تمام DropDownList را در هر پسوند می سازد .
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 == "DropDownList")
{
CreateDropDownList(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 = "DropDownList" Then
CreateDropDownList(ctrlID)
End If
Exit For
End If
Next
Next
End If
End Sub
همانطور که در بالا ذکر شده است، ابتدا اولین نوع رشته خاصی را در ddlDynamic در مجموعه Request.Form پیدا میکنیم و سپس از طریق هر آیتم حلقه میکنیم و DropDownList را با استفاده از تابع CreateDropDownList که قبلا توصیف شده است، نگهداری میکنیم.
یکی از مهمترین مواردی که باید اشاره کرداین است که افراد همیشه هنگام شناسایی آنها، ارائه شناسه های منحصر به فرد برای کنترل های پویا را نادیده میگیرند