PDA

View Full Version : رویداد Button.click برای button های ایجاد شده در زمان load



Masuod
چهارشنبه 04 خرداد 1384, 01:39 صبح
سلام فرض کنید با دستورات زیر یکسری کلید ساخته ایم



for (int n=0;n<10;n++)
{


Button Bt=new Button();

Bt.Text=""+n+"";
Panel1.Controls.Add(Bt);
}

حالا میخوام یه رویداد کلیک ساده به اونها اختصاص بدهیم
مثل
label1.text=Bt.text
یعنی با فشردن هر کدام ازکلیدهای ایجاد شده text روی کلید به label اختصاص یابد
من این کار را برای کلیدهای موجود به سادگی انجام میدم .
اما برای این کلیدها امکان نداره من متوجه نشدم چطور از این شکل دستور استفاده کنم


Bt.Click += new EventHandler(Bt_Click);

چون در name space راجع به کلیک object ی که موجود نیست تعریفی هم نشده
من حتی با خواندن این سوال هم بازهم متوجه نشدم :sorry:


Attatch کردن رویداد Click به یک کنترل در زمان اجرا
http://www.barnamenevis.org/forum/viewtopic.php?t=19537&highlight=%2Aquerystring%2A

:گیج:
لطفا کمک کنید در ضمن من زیادحالیم نیست لطفا یه کدی چیزی برام بگزارید با C# توی code behind

titbasoft
چهارشنبه 04 خرداد 1384, 09:50 صبح
در کد بالا از bt برای اختصاص event استفاده شده در حالی که اگر کد اختصاص handler دقیقا بعد از ساخته شدن کنترل ها بیاد فقط آخرین کنترل در نظر گرفته خواهد شد. برای رفع مشکل برای هر کنترلتون یک ID مشخص کنید و با استفاده از متد findControl اون رو پیدا کنید و event رو بهش اختصاص بدید

چند تا سوال و نکته:
1) منظورتون رو میشه واضح تر بگید

چون در name space راجع به کلیک object ی که موجود نیست تعریفی هم نشده

2) کنترل های dynamic تون رو کجا می سازید؟ (منظورم توی کدوم رویداد)
3) event هاتون رو کجا نسبت می دید؟

* به سیکوئنس اجرای event های فرم توجه کنید:
<p dir=ltr>
1) Page_Init: The server controls are loaded and initialized from the Web form’s view state. This is the first step in a Web form’s life cycle.

2) Page_Load: The server controls are loaded in the Page object. View state information is available at this point, so this is where you put code to change control settings or display text on the page.

3) Page_PreRender: The application is about to render the Page object.

4) Page_Unload: The page is unloaded from memory.

5) Page_Disposed: The Page object is released from memory. This is the last event in the life of a Page object.

6) Page_Error: An unhandled exception occurs.

7) Page_AbortTransaction: A transaction is aborted.

8) Page_CommitTransaction: A transaction is accepted.

9) Page_DataBinding: A server control on the page binds to a data source.
</p>

* دقت کنید که حداکثر تا page_load باید event هاتون رو نسبت بدید چون تمامی event های کنترل های داخل صفحه تا قبل از page_prerender اتفاق افتاده اند

Masuod
جمعه 06 خرداد 1384, 14:55 عصر
سلام
ممنون از توجه شما
من در مورد اول که یک ID برای کلیدها بزارم مشکل خاصی ندارم اما در مورد findControl اصلا تا حالا چیزی نشنیدم.
لطف کنید یه مثال بزنید. یا اگر ممکنه مثال من رو کامل کنید.
من این کد رو در pageload نوشتم و میخواستم هم در همون pageload هم event handler رو بنویسم
منطور من هم از
چون در name space راجع به کلیک object ی که موجود نیست تعریفی هم نشده
این بود که خب نمیشه از کلیدی که ایجاد شده و در فرم نبوده بصورت



Button btn=Button&#40;sender&#41;;

استفاده کرد و متن روی کیلد یعنی از خاصیتtext یک Buttom1.text=label1.text به این صورت استفاده کرد و متن روی کلید را به جایی پاس داد. اصولا من نمیدونم این حرف من چقدر منطقی چون این خاصیت(Buttom1.text=label1.text ) بدون تعریف senedr به عنوان یک object نیز امکان پذیره ...
اگه میشه کدددد please! :(

titbasoft
جمعه 06 خرداد 1384, 19:01 عصر
اما در مورد findControl اصلا تا حالا چیزی نشنیدم.
http://www.barnamenevis.org/forum/viewtopic.php?t=22688&amp;highlight=findcontrol&amp;p=1175 13#117513
(توی همین پست هم می تونید به مثال آخر توجه کنید)

حالا چرا توی همون حلقه event ها رو نسبت نمی دید؟ مثلا:

private void Page_Load&#40;object sender, System.EventArgs e&#41;
&#123;
for &#40;int n=0;n&lt;10;n++&#41;
&#123;
Button Bt=new Button&#40;&#41;;
Bt.Text=""+n+"";
Bt.Click += new EventHandler&#40;Bt_Click&#41;;
Panel1.Controls.Add&#40;Bt&#41;;
&#125;
&#125;

private void Bt_Click&#40;object sender, System.EventArgs e&#41;
&#123;
Response.Write&#40;&#40;&#40;Button&#41;sender&#41;.Text&#41;;
&#125;
به هر حال 2 راه دیگه هم وجود داره:
اول:

foreach &#40;Control ctrl in Panel1.Controls&#41;
if &#40;ctrl is Button&#41;
&#40;&#40;Button&#41;ctrl&#41;.Click += new EventHandler&#40;Bt_Click&#41;;
دوم: به شرطی که ID هاتون رو یه صورت btn1 , btn2 , ... تعریف کرده باشین

for &#40;int n=0;n&lt;10;n++&#41;
&#123;
Button btn = &#40;Button&#41;Panel1.FindControl&#40;"btn"+n&#41;;
btn.Click += new EventHandler&#40;Bt_Click&#41;;
&#125;

Masuod
جمعه 06 خرداد 1384, 20:43 عصر
با تشکر از شما دوست عزیز
هرچند این textbox مجال صحبت را ندارد اما کوتاه میگم که:
در جامعه ای که دانستن همیشه عاملی برای برتری و نگفتن ابزاری در جهت حفظ این برتری است ... این وب سایت و دوستانی که در آن فعالیت میکنند به برچیدن این اندیشه که (اگر بگی از دستت میره و برایت رقیب پیدا میشه ) گام برداشته اند.

:flower:

titbasoft
جمعه 06 خرداد 1384, 21:09 عصر
شما هم سعی کنید همین طور باشید. مطمئن باشید بیشتر از اون چیزی که یاد می دید یاد می گیرید :wink: