امکان افزودن textbox و DropDownList درAsp.Net و VB.Net
پنجشنبه 10 اردیبهشت 1394در این مقاله امکان افزایش کنترل TextBox و کنترل DropDownList توسط کاربر در Asp.Net و VB.Net را شرح خواهیم داد
برای ایجاد امکان افزودن کنترل Dynamic مطابق مراحل زیر عمل می کنیم :
برای این کار ابتدا یک پروژه جدید در محیط ویژوال استودیو ایجاد میکنیم , سپس در قسمت کدنویسی صفحه (CodeBehind) کد زیر را وارد میکنیم ,
#C :
Button btnSubmit = new Button(); btnSubmit.ID = "btnSubmit"; btnSubmit.Text = "Submit";
VB.Net :
Dim btnSubmit As New Button() btnSubmit.ID = "btnSubmit" btnSubmit.Text = "Submit"
در ادامه در رویداد OnClick مربوط به دکمه , کد زیر را مینویسیم
#C
btnSubmit.Click += new System.EventHandler(btnSubmit_Click);
VB.Net
AddHandler btnSubmit.Click, AddressOf btnSubmit_Click
برای جلوگیری از پیغام خطای مربوط به کامپایل دستور زیر را باید بنویسیم :
#C
protected void btnSubmit_Click(object sender, EventArgs e) { //OnClick Event Handler for btnSubmit }
VB.Net :
Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As EventArgs) 'OnClick Event Handler for btnSubmit End Sub
در آخر شما باید کنترل dynamic را در صفحه قرار دهید , به کد زیر دقت فرمایید :
#C :
this.form1.Controls.Add(btnSubmit);
Vb.Net :
Me.form1.Controls.Add(btnSubmit)
هنگامی که از Master Page استفاده می کنیم , هیچ form در صفحه قرار ندارد , بنابراین برای رفع این مشکل باید دستور زیر را در ContentPlaceHolder قرار میدهیم
#C
ContentPlaceHolder content = (ContentPlaceHolder)this.Master.FindControl("ContentPlaceHolder1");
VB.Net :
Dim content As ContentPlaceHolder = DirectCast(Me.Master.FindControl("ContentPlaceHolder1"), ContentPlaceHolder)
تنها تفاوت بین صفحه ممولی و master page این است که به جای افزودن dynamic control در master page شما باید آن را در ContentPlaceHolder قرار دهید
#C :
content.Controls.Add(btnSubmit);
VB.Net :
content.Controls.Add(btnSubmit)
کنترلهای Dynamic باید هر مرتبه که صفحه به سمت سرور ارسال میشود ، ایجاد شوند .بنابراین با هر بار PostBack آنها بازسازی میشوند .برخی برنامه نویسان به اشتباه کدهای ایجاد کنترل Dynamic را در شرط Not isPostBack قرار می دهند .در این شرایط کنترل Dynamic برای بار اول در متد PageLoad صفحه ایجاد میشود .هنگامی که PostBack در حالت false (غیرفعال باشد ) کنترلهای Dynamic ایجاد نمی شوند .
بنابراین برای جلوگیری از تمامی از این مشکلات باید دستور ایجاد کنترل Dynamic را در خارج از بلوکهای شرط در متد PageLoad قرار دهیم .
#C
//Dynamic TextBox Panel pnlTextBox = new Panel(); pnlTextBox.ID = "pnlTextBox"; pnlTextBox.BorderWidth = 1; pnlTextBox.Width = 300; this.form1.Controls.Add(pnlTextBox);
VB.Net
'Dynamic TextBox Panel pnlTextBox = New Panel() pnlTextBox.ID = "pnlTextBox" pnlTextBox.BorderWidth = 1 pnlTextBox.Width = 300 Me.form1.Controls.Add(pnlTextBox)
یک دکمه برای ایجاد کنترل TextBox ایجاد می کنیم
//Button To add TextBoxes Button btnAddTxt = new Button(); btnAddTxt.ID = "btnAddTxt"; btnAddTxt.Text = "Add TextBox"; btnAddTxt.Click += new System.EventHandler(btnAdd_Click); this.form1.Controls.Add(btnAddTxt);
VB.Net
'Button To add TextBoxes Dim btnAddTxt As New Button() btnAddTxt.ID = "btnAddTxt" btnAddTxt.Text = "Add TextBox" AddHandler btnAddTxt.Click, AddressOf btnAdd_Click Me.form1.Controls.Add(btnAddTxt)
رویداد btnAdd_Click با هر بار کلیک توسط کاربر،یک کنترل Textbox به صفحه اضافه میکند .
#C
protected void btnAdd_Click(object sender, EventArgs e) { Button btn = (Button)sender; if (btn.ID == "btnAddTxt") { int cnt = FindOccurence("txtDynamic"); TextBox txt = new TextBox(); txt.ID = "txtDynamic-" + Convert.ToString(cnt + 1); pnlTextBox.Controls.Add(txt); } }
VB.Net
Protected Sub btnAdd_Click(ByVal sender As Object, ByVal e As EventArgs) Dim btn As Button = DirectCast(sender, Button) If btn.ID = "btnAddTxt" Then Dim cnt As Integer = FindOccurence("txtDynamic") Dim txt As New TextBox() txt.ID = "txtDynamic-" & Convert.ToString(cnt + 1) pnlTextBox.Controls.Add(txt) End If End Sub
تابع FindOccurence به راحتی می تواند تعداد درخواستی که به سمت Request.Form شده است را شمارش کند .در کد بالا txtDynamic را بدست می آوریم ، سپس در صورتی که کاربر مجدد بر روی دکمه افزودنTextBox کلیک کرد یک مقدار به آن اضافه میکند .
#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
اکنون زمانی که شما بر روی دکمه افزودن کلیک می کنید تمام مقادیر کنترلهای ایجاد شده با هر بار PostBack تغییر می کند و مقادیر آنها باید مجدد خوانده شود .تابع RecreateControls این عمل را انجام میدهد .این تابع دو پارامتر را دریافت میکند :
ctrlPrefix این پارامتر پسوند کنترل را بررسی می کند
ctrlType این پارامتر نیز نوع کنترل را بررسی میکند
#C
if (IsPostBack) { RecreateControls("txtDynamic", "TextBox"); }
VB.Net
If IsPostBack Then RecreateControls("txtDynamic", "TextBox") End If
در کد نویسی شما باید کنترلهای ایجاد شده را با & از یکدیگر تفکیک کنید ، همچنین نام آنها را نیز باید بطور جداگانه تعریف کنید
txtDynamic-1=&txtDynamic-2=&txtDynamic-3=&txtDynamic-4...
برای اینکه مجموعه Request.Form را با استفاده از (&) از یکدیگر تفکیک کنیم دستور زیر را باید بنویسیم
#C
string[] ctrls = Request.Form.ToString().Split('&');
int cnt = FindOccurence(ctrlPrefix);
VB.Net
Dim ctrls As String() = Request.Form.ToString().Split("&"c) Dim cnt As Integer = FindOccurence(ctrlPrefix)
سپس تمامی المان های داخل Request.Form را در حلقه قرار میدهیم .
#C
private void RecreateControls(string ctrlPrefix, string ctrlType) { string[] ctrls = Request.Form.ToString().Split('&'); int cnt = FindOccurence(ctrlPrefix); if (cnt > 0) { Literal lt; for (int k = 1; k <= cnt; k++) { for (int i = 0; i < ctrls.Length; i++) { if (ctrls[i].Contains(ctrlPrefix + "-" + k.ToString())) { string ctrlName = ctrls[i].Split('=')[0]; string ctrlValue = ctrls[i].Split('=')[1]; //Decode the Value ctrlValue = Server.UrlDecode(ctrlValue); if (ctrlType == "TextBox") { TextBox txt = new TextBox(); txt.ID = ctrlName; txt.Text = ctrlValue; pnlTextBox.Controls.Add(txt); } 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 Dim lt As Literal For k As Integer = 1 To cnt For i As Integer = 0 To ctrls.Length - 1 If ctrls(i).Contains((ctrlPrefix & "-") + k.ToString()) Then Dim ctrlName As String = ctrls(i).Split("="c)(0) Dim ctrlValue As String = ctrls(i).Split("="c)(1) 'Decode the Value ctrlValue = Server.UrlDecode(ctrlValue) If ctrlType = "TextBox" Then Dim txt As New TextBox() txt.ID = ctrlName txt.Text = ctrlValue pnlTextBox.Controls.Add(txt) End If Exit For End If Next Next End If End Sub
- C#.net
- 2k بازدید
- 2 تشکر