امکان افزودن textbox و DropDownList درAsp.Net و VB.Net

در این مقاله امکان افزایش کنترل TextBox و کنترل DropDownList توسط کاربر در Asp.Net و VB.Net را شرح خواهیم داد

امکان افزودن 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
فایل های ضمیمه