توضیحات و دانلود

Dynamic Controls در ASP.Net
0 0
Dynamic Controls در ASP.Net

Dynamic Controls

کنترل های دینامیکی در زمان اجرا ایجاد می شوند و سپس به  صفحه اضافه می شوند 

کد زیر یک دکمه داینامیک ایجاد میکند .

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

در زیر یک رویداد  OnClick را به دکمه پویا اضافه می کنیم. هنگامی که دکمه روی آن کلیک می شود

btnSubmit_Click فراخوانی خواهد شد

C #

 btnSubmit.Click += new System.EventHandler(btnSubmit_Click);

VB.Net 

AddHandler btnSubmit.Click, AddressOf btnSubmit_Click

رویداد Handler

لازم است قبل از اختصاص دادن آن به کنترل پویا یک Event Handler ایجاد کنید تا از تکرار جلوگیری شود.

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

اضافه کردن کنترل در صفحه

در نهایت شما نیاز به اضافه کردن کنترل پویا به صفحه را دارید. در کد زیر، دکمه پویا را به فرم اضافه میکنیم.

C #

this.form1.Controls.Add(btnSubmit);

  VB.Net 

Me.form1.Controls.Add(btnSubmit)

کنترل پویا با Master Pages

هنگام استفاده از صفحات اصلی هیچ فرمی در صفحات محتوا وجود ندارد. بنابراین این سوال در مورد اضافه کردن کنترل های پویا به وجود می آید. پاسخ ContentPlaceHolder است .

در زیر کد توضیح می دهد که چگونه مرجع ContentPlaceHolder را در صفحه محتوا با استفاده از شناسه آن دریافت کنید.

C #

ContentPlaceHolder content = (ContentPlaceHolder)this.Master.FindControl("ContentPlaceHolder1");

 VB.Net 

Dim content As ContentPlaceHolder = DirectCast(Me.Master.FindControl("ContentPlaceHolder1"), ContentPlaceHolder)

در حال حاضر تنها تفاوت بین صفحات عادی و صفحات اصلی این است که به جای اضافه کردن کنترل های پویا به صفحه اصلی شما باید کنترل ها را به ContentPlaceHolder اضافه کنید که ارجاع شما بالاتر از آن است. کد زیر را ببینید.

C #

content.Controls.Add(btnSubmit);

 VB.Net 

content.Controls.Add(btnSubmit)

کنترل های دینامیکی باید هر بار که صفحه به سرور ارسال می شود، ایجاد شود، پس آنها بعد از ارسال پس از ظهور در صفحه ظاهر می شوند.   بسیاری از افراد اشتباه می کنند کد آنها را ایجاد می کند و کنترل های دینامیکی را در وضعیت Not isPostBack ایجاد می کند. به این ترتیب کنترل های پویا تنها زمانی ایجاد می شوند که صفحه بارگیری می شود، زیرا شرایط درست است. اما زمانی که یک پست پس از کنترل برخی از کنترل های پویا ایجاد نمی شود، زیرا شرایط نادرست است.

بنابراین برای جلوگیری از آن کد برای ایجاد کنترل های پویا باید خارج از تمام بلوک های شرطی در بار صفحه قرار گیرد.

باکنون یک پنل پویا اضافه خواهیم کرد که به عنوان یک کانتینر برای کادرهای پویاعمل خواهد کرد

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 های پویا خواهد بود.

C #

//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  handler پویا را به صفحه اضافه می کند.

اکنون برای پیگیری دکمه های دینامیک باید از بعضی از پیشوند ها برای پیگیری استفاده کنید  

شناسه جعبه های متن

در اینجا  از prefex txtDynamic برای شناسه تمام جعبه های پویا استفاده می کنیم. بنابراین اولین جعبه متن خواهد بود

txtDymanic-2  txtDynamic-1 و غیره خواهد بود.

این به ما کمک می کند که جعبه های متن را شناسایی کرده و ارزش های خود را نیز نشان دهند. جعبه متن ایجاد شده است و به پنل pnlTextBox اضافه شده که برای ایجاد پوسته های متن پویا به عنوان نگهدارنده عمل می کند

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

متوجه خواهید شد که  از یک متغیر cnt و یک تابع FindOccurence استفاده می کنیم.

تابع FindOccurence به سادگی محاسبات رخدادهای زیر رشته را که در مجموعه Request.Form به آن منتقل شده است، محاسبه می کند. در کد بالا، تابع substring txtDynamic را انتقال می دهیم؛ به این ترتیب تعداد کادر های پویا موجود را  می دهد. از این رو، جعبه متن بعدی دارای شناسه بیشتر از کل تعداد یعنی cnt + 1 است .

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

حالا وقتی روی دکمه افزودن کلیک میکنید، یک پست پسوند وجود دارد بنابراین تمام کنترلها باید بازسازی شوند و ارزشهای آنها را مجددا اعطا کنید

عملکرد RecreateControls این کار را انجام می دهدوپارامترهای زیر را می پذیرد

1      ctrlPrefix - پیشوند مورد استفاده برای کنترلهایی مانند txtDynamic، ddlDynamic

2      ctrlType -    نوع کنترل TextBox، DropDownList

بنابراین بر اساس کنترل شما باید ارزش های مناسب را منتقل کنید.

در اینجا  TextBox ها را ایجاد می کنیم بنابراین تابع را به صورت زیر فراخوانی می کنیم

C #

if (IsPostBack)

{

    RecreateControls("txtDynamic", "TextBox");

}

VB.Net

If IsPostBack Then

   RecreateControls("txtDynamic", "TextBox")

End If

توجه داشته باشید که  تابع را در وضعیت isPostBack مطرح کنید دلیل این کار این است که کنترل ها باید تنها پس از بازبینی مجدد شوند.

عملکرد RecreateControls

ابتدا بررسی می کنیم که چند کنترل از آن پیشوند در مجموعه Request.Form وجود دارد. در زیر  نشان خواهیم داد که مجموعه Reqeust.Forms مجموعه ای از ارزش آن را ذخیره می کند به طوری که شما منطق را برای کشیدن ارزش ها بهتر می کنید. تصویر زیر را ببینید.

در شکل متن Visaualizer  شما متوجه خواهید شد که کنترل ها توسط ampersand (&) جدا شده اند .نام کنترل و مقدار با Equal to Sign (=) به روش زیر تفکیک می شوند.

txtDynamic-1=&txtDynamic-2=&txtDynamic-3=&txtDynamic-4...

 برای اینکه به مجموعه Request.Form را بر اساس شخصیت ampersand (&) تقسیم  و همچنین وقایع پیشوند را در مجموعه پیدا  کنید به کد زیر را مراجعه کنید

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 و تعداد پیشوند ها بر اساس مقدار بازگشتی شده توسط تابع FindOccurence حلقه می کنیم و هر عنصر را با عنصر Request.Form مطابقت می دهیم تا مقادیر در TextBox ها را به دست آوریم و آنها را مجددا بر این اساس تعیین کنیم .

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

در کد بالا متغیرهای ctrlName و ctrlValue نام و مقدار کنترل را به ترتیب نشان می دهندو بر اساس شناسه گرفته شده و مقدار کنترل دوباره بازسازی می شوند. بنابراین  ببینید که چگونه در شکل متحرک کار می کند.

 همین کار را با DropDownList انجام دهید و  کد را برای همان کد source همراه خواهید یافت

 


دانلود
  • لینک های دانلود دوره های آموزشی تا پایان دوره قابل دانلود می باشد.
  • برای خارج کردن فایل ها از حالت فشرده از ورژن جدید نرم افزار winrar استفاده کنید.
  • برای خارج کردن فایل ها از حالت فشرده لینک های دانلودی که چندین قسمت می باشند فقط قسمت اول را از حالت فشرده خارج کنید.
  • لطفا توضیحات نوشته شده برای مطالب را با دقت بخوانید.
  • برای نمایش فیلم ها می توانید از نرم افزار هایی مانند Km Player , VLC Player یا Media Player Classic استفاده کنید.

ارسال نظر
ارسال پیام به :