PDA

View Full Version : جستجوی یک کنترل با type خاص در یک صفحه



persianboy62
دوشنبه 04 خرداد 1388, 16:22 عصر
چطور میشه یک کنترل خاص رو در یک صفحه aspx جستجو کرد بدون اینکه ID اون کنترل رو داشته باشیم. برای مثال من میخوام تمام کنترلهایی که از جنس Image Button هستند رو در صفحه پیدا کنم و یک مقدار مشخص بهشون بدم.

persianboy62
سه شنبه 05 خرداد 1388, 15:13 عصر
کسی پاسخ این سوال رو نمی دونه!؟

Behrouz_Rad
سه شنبه 05 خرداد 1388, 15:43 عصر
تمامی کنترل های صفحه در سلسله مراتب پدر فرزندی قرار می گیرن که باید از طریق یک "تابع بازگشتی" به فرزندان کنترل مورد نظر دسترسی پیدا کرد.

یک تابع نمونه واست نوشتم به شکل ذیل:

VB.NET


Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
GetControls(Me) 'Example 1
'GetControls(GridView1) 'Example 2
'GetControls(Panel1) 'Example 3
End Sub

Private Sub GetControls(ByVal parentControl As Control)
For Each ctl As Control In parentControl.Controls

If (ctl.HasControls) Then
GetControls(ctl)
ElseIf (ctl.GetType Is GetType(TextBox)) Then
DirectCast(ctl, TextBox).BackColor = Drawing.Color.Yellow
End If

Next
End Sub


#C


protected void Button1_Click(object sender, EventArgs e)
{
GetControls(Me); //Example 1
//GetControls(GridView1); //Example 2
//GetControls(Panel1); //Example 3
}

private void GetControl(System.Web.UI.Control parentControl)
{
foreach (System.Web.UI.Control ctl in parentControl.Controls)
{
if (ctl.HasControls())
{
GetControl(ctl);

}
else if (ctl.GetType() == typeof(TextBox))
{
((TextBox)ctl).BackColor = System.Drawing.Color.Yellow;
}
}
}


در کدهای بالا، رنگ پس زمینه ی تمامی TextBox های موجود در صفحه زرد میشه. برای اینکه فقط TextBox خاصی رو تحت تاثیر قرار بدی، می تونی اون TextBox ها رو در کنترل Panel قرار بدی و به متد GetControls، نام کنترل Panel رو پاس بدی.

موفق باشید...

farhad1367
سه شنبه 05 خرداد 1388, 19:06 عصر
بهترین راه حل این است .
for each c as control in me.controls
if typeof c is textbox then c.text=""
next

به همین ترتیب که من الان متن تمامی textbox ها رو بدون داشتن آی دی پاک کردم .

Behrouz_Rad
چهارشنبه 06 خرداد 1388, 09:39 صبح
بهترین راه حل این است .

یادت باشه که هیچ وقت "بهترین"ی وجود نداره.

کدی که نوشتی صحیح نیست.
برای امتحانش، یک Panel بر روی فرم قرار بده و در اون Panel هم یک TextBox قرار بده. حالا بهم بگو آیا کدی که نوشتی تونست به اون TextBox مقداردهی کنه؟! نه نتونست!

یک Page در بالاترین سطح از یک HtmlForm تشکیل شده و اولین اشکال کدت اینه که فقط HtmlForm رو برمیگردونه.
دومین اشکالت اینه که قصد داری مستقیماً به خاصیت Text متغیر c که از نوع Control هست دسترسی پیدا کنی! در اینجا حتماً باید Casting انجام بدی چون کلاس Control خاصیتی با نام Text نداره!
اگر فرض کنیم که کنترل مورد نظر حتماً و حتماً در خود فرم وجود داره و در Container ای نیست، اصلاح شده ی کدهات به شکل ذیل میشه:



For Each c As Control In Me.Controls
If (c.GetType.Name = "HtmlForm") Then
For Each a As Control In c.Controls
If TypeOf a Is TextBox Then
DirectCast(a, TextBox).Text = "Hello World!"
End If
Next
End If
Next


در نهایت اینکه حتماً و حتماً باید از یک تابع بازگشتی استفاده بشه.

موفق باشید. :)