یه نکته ی مهم و اشتباه برانگیز برای کد دادن به رویداد (رویداد اشیاء) :
اول از همه بگم این تیکه رو مدیون اوستا محسن ام و واقعا ازش ممنونم (ما را از هچل نجات داد )
نگا کنین ، به قول اوستا محسن ، یه پن شیش تا شی Button بزارین تو صفه با نام پیش فرض خودش و یه شی دیگه (مثلا Lable) هم بزارین . تو این لیبل هه ، این کد رو بدین :
کد:Page.SetObjectScript("Button"..j, "On Click", "Dialog.Message(\"\", j);"); j=j+1
تو گلوبال فانکشن یا استارت آپ هم این رو :
الان تصورتون چیه؟ دکمه ی 1 و 2 و 3 رو بزنین ، برا هر کدوم چه پیامی میده؟کد:j=1
تصور اغلب افرادی که مثل من ان اینه که وقتی دکمه ی Button1 رو بزنن ، پیام 1 رو میده (چون j در اون لحظه ، 1 هه) و وقتی دکمه ی دوم رو میزنین ، پیام 2 و ... رو بده
اما این گونه نیست چگونه هست؟
این جوریه که j مقدار اولیه اش تو دهلیز (نه بطن ) ورود ، 1 بود . بعد خط اول بالا که گفت تو Button..j ، کدی رو ست کن که مقدار j رو بنویسه. ینی چی تا اینجا؟ خوب مقدار j رو جایگزین کنین دیگه ینی اینکه تو Button1 ، پیام ای رو ست کن که عنوان اش ، 1 باشه (البته تا اینجا) . بعد تو خط بعد ، یکی به مقدار j میافزایه خوب حالا دوباره کد بالا رو ترجمه کنین با این مقدار جدید . چی میشه؟ تا اینجاش که رو Button1 ست کنه که انجام شد . هیچ چی . ینی نه اینکه مقدار j برابر 2 شد و از اون طرف هم گفتیم کد رو تو Button..j ست کن ، پس تو Button2 ست میکنه . این که ملومه اون خط کد اجرا شد و برای Button1 کد رو ست کرد و رف پی کارش . وقتی برا دکمه ی 2 ست میکنه کد رو که شما دوباره رو شی Lable کلیک کنین یا اینکه مثلا بعد خط دوم ، کد ست کردن رو مینوشتین. پس تا اینجا مشکلی ندارین؟ خوب حالا ادامه ی نگا رو میندازیم . پس تا اینجا j برابر 2 شد و تو دکمه ی اول یا Button1 این کد رو ست میکنه که وقتی کلیک کنیم ، مقدار j رو نشون میده که برابر چی هست؟ برابر 2
پس اولین باری که کلیک کنین تو دکمه ی اول ، پیام 2 رو میده نه 1 رو . چون قبل اجرا شدن دومین بار کد
کد:Page.SetObjectScript("Button"..j, "On Click", "Dialog.Message(\"\", j);");
، مقدار j یکی اضافه شد . حالا دومین بار وقتی کلیک کنین چی میشه؟ تو Button2 (چون j فعلا 2 هه) ، میگه j رو نمایش بده که قبل از اینکه کد خط بالا اجرا بشه ، مقدار j یکی اضافه میشه پس وقتی دکمه ی 1 یا 2 رو کلیک کنین که دستور داده شد مقدار j رو نشون بده تو هر دوشون ، هر کدوم رو کلیک کنین ، مقدار 3 پیام داده میشه و الی آخر
پس برای رفع این مشکل و موقعی که میخایم یه کد رو ست کنیم که مثلا تو Button1 ، یه پیام خاص رو ست کنه و تو Button2 ، یه پیام خاص دیگه رو ، باید متغییری که نام میبریم ، شماره ی همون دکمه باشه و هر بار ، با اجرای هر دفه کلیک روی دکمه ، اول اون متغییر (تو اینجا مقدار j) اور رایت بشه یا اگه مقدار آرایه ی خاص رو هم میخایم که ست کنه ، به شماره ی همون عضوی که میخایم ، اوررایت اش کنیم اون متغییر رو
یادتون باشه این مقداری که برای اندیس تو آرایه ها اوررایت میشه ، هر بار یکی بهش اضافه میشه ممولا و کلا مقدارش یکی بیشتر یا برابر آخرین عضو آرایه هست اما تو این حالت ما میخایم هر دکمه ای که اجرا میکنیم ، اون متغییر (تو اینجا مقدار j) قبلش برابر شماره ی اون عضوی بشه که ما میخایم
انگار در وهله ی اول ، فقط از همین طریق ، میشه این کار رو انجام دادخوب برا اوررایت کردن هم باید شماره ی اون دکمه رو بگیریم که انگار راهی جز زمان اجرای خود کد ینی داخل پارامتر یا آرگومان سوم ورودی بالا نداریم. پس باید این جوری بنویسین :
کد:Code = "ButtonName = Button.GetProperties(this);ButtonNumber = String.Mid(ButtonName.ObjectName, 7, -1); Dialog.Message(\"\", ButtonNumber );" Page.SetObjectScript("Button"..j, "On Click", Code); j=j+1
که موقه اجرای کد ، تو هر دکمه ، اول شماره ی دکمه رو میگیره بعد اونو مینویسه و مستقل از متغییر j عمل میکنه و هر بار هم این متغییر اوررایت و مقدارشم برابر مقدار همون شماره ی دکمه میشه (ینی رو دکمه ی 5 کلیک کنین ، این متغییر 5 میشه و بدش رو دکمه ی 9 کلیک کنین ، بدش 9 میشه) و مثل متغییر j نیست که هر بار فقط یه دونه اضافه بشه
از آقا محسنم بازم تشکر میکنم که بابتش وقت گزاشت






پاسخ با نقل قول
Bookmarks