PDA

View Full Version : سوال: تشخیص Button کلیک شده UserControl در وب فرم



saghari
دوشنبه 03 اسفند 1388, 16:07 عصر
با سلام
فرض کنید من یه web user control دارم بنام testUC که روی اون 2 تا دکمه است به نام های btn1 و btn2
و من testUC رو روی یک فرم وب به اسم from1 گذاشتم.
سوال :
وقتی کاربر در فرم form1 روی یکی از دو دکمه کلیک کنه من چطور باید تشخیص بدم دکمه btn1 کلیک شده یا btn2

اگر همراه با توضیح یه کد کوچولو هم بزارید که خیلی لطف کردید

قبلا از توجه شما ممنونم

Chabok
سه شنبه 04 اسفند 1388, 01:16 صبح
با سلام

اگر کلیدهای شما از نوع Button های asp.net یعنی کنترل های سمت سرور هستند ، مشکلی نیست .

زیرا هر کدام رویداد Click مجزای خود را دارند .

در محیط طراحی ، روی این کلیدها دابل کلیک کنید تا رویداد Click آن ها ایجاد شود و بتوانید در آن ها کد خود را بنویسید .

اگر روش شما متفاوت است باید جزئیات بیشتری ارائه کنید .

موفق باشید .

saghari
سه شنبه 04 اسفند 1388, 07:38 صبح
با سلام
ممنون از توجه شما
بله دکمه های وب کنترل از نوع کنترل های سمت سرور هستند. ولی من از داخل فرم به خصوصیات دکمه های درون وب کنترل روی فرم دسترسی ندارم.
البته من العان دارم اینجوری کار میکنم که هر دکمه که روی وب کنترل کلیک میشه یک مقدار رو تو Get میذاره و بعد من اونو تو فرم میخونم و تشخیص میدم کدام دکمه کلیک شده.
ولی من میخوام بدونم بدون اینکه مقدار پاس کنم آیا میتونم از توی فرم تشخیص بدم که کدام دکمه در وب یوزر کنترلی که روی فرم است توسط کاربر کلیک شده.

Chabok
سه شنبه 04 اسفند 1388, 12:31 عصر
با سلام

اگر درست متوجه منظور شما شده باشم ، شما قصد دارید داخل وب فرم (و نه داخل خود یوزر کنترل) کلید کلیک شده موجود در یوزر کنترل را تشخیص دهید .

همانگونه که می دانید رویداد Click مختص asp.net است و در کل در وب ، رویداد مستقیمی سمت سرور به نام Click یک Button وجود ندارد .

چیزی که تحت عنوان رویداد Click صورت می گیرد پاس شدن name و Value عنصر input type=submit به سرور است که از این طریق می توان فهمید چه button ی کلیک شده است .

یعنی شما اگر بتوانید value متعلق به button مورد نظر را(همان label آن) که به سرور ارسال شده است را بخوانید ، می توانید button کلیک شده را تشخیص دهید .

ولی مشکل اینجاست که در یوزر کنترل ها ، هنگام ارسال اطلاعات به کلاینت ، نام کنترل ها همان ID مورد نظر نیست و تغییر می کند .

برای مثال یک asp.net Button با ID = Button1 سمت کلاینت به صورت زیر ارسال می شود .


<input type="submit" id="ctl02_Button1" value="Button1" name="ctl02$Button1">

همان گونه که مشاهده می کنید ID , name ایجاد شده تغییر کرده است .

این مقادیر جدید در خود یوزر کنترل قابل دسترسی است .

Id را می توان توسط ClientID و name را توسط UniqueID کنترل بدست آورد .

هنگام کلیک کردن این باتن مقدار name=value به سرور ارسال می شود و می توان آن را توسط

Request["name"]
یا همان
Request[Button1.UniqueID]

بدست آورد .

و در واقع در کنترل های asp.net نیز اگر value یک Button توسط name آن به سرور ارسال شده باشد رویداد Click کلید مورد نظر Fire می شود .

این صحبت ها بخاطر این بود که اگر شما نیاز دارید در صفحه وب فرم ، کلید کلید شده که در همان صفحه نیست را تشخیص دهید نیاز دارید تا توسط Request چک کنید که آیا value این کنترل به سرور ارسال شده است یا خیر .

که فکر میکنم در صورتی که این کلیدهای خود را بصورت Public تعریف کنید ، بتوانید در وب فرم به آن ها دسترسی پیدا کرده و UniqueID آن را بدست آورده و توسط Request ارسال value آن را به سرور چک کنید و کلیک شدن آن را تشخیص دهید .

ولی بنظر من راه ساده تر استفاده از یک Link ساده است که یک پارامتر به QueryString پاس داده و توسط آن فرمان مورد نظر را تشخیص دهید .

موفق باشید .

saghari
سه شنبه 04 اسفند 1388, 13:39 عصر
ممنون دوست عزیز
با توجه به توضیح شما احتمالا باید از روش دیگه ای برای حل مشکلم استفاده کنم.
اگه برای سوال زیر راه حلی باشه مشکلم حل میشه:
فرض منید من یه روال نوشتم که با کلیک یه دکمه روی فرم اجرا میشه مثلا کد زیر:


textbox1.text="aaaa"
textbox2.text="fff"

حالا آیا روشی هست که بدون اینکه کاربر پیغامی ببینه بعد از اجرا شدن سطر اول یعنی textbox1.text="aaa" صفحه منتظر بمونه تا کاربر دکمه ای رو کلیک کنه و بعد از کلیک شدن دکمه برنامه ادامه کد رو اجرا کنه؟

ممنون از توجه شما

naeeme
سه شنبه 04 اسفند 1388, 13:54 عصر
من پیشنهاد می کنم که از event ایجاد کنید و با usercontrol خودتون دقیقا مانند یک کنترل رفتار کنید. شما باید دلیل خاصی داشته باشید تا یک usercontrol ایجاد کنید. بهترین دلیل برای من این هست که یک سری کارهای تکراری رو انجام ندم مثل چک کردن صحت مقادیر و ...
خوب! من برای این کار در usercontrol یک event تعریف می کنم و وقتی همه چیز ok بود اون event رو raise می کنم.

اینجوری هم استقلال usercontrol حفظ شده و هم من تونستم از رخدادن click در این کنترل با خبر بشم.

تعریف EVENT:


Public Event SubmitClick(ByVal sender As System.Object, ByVal e As System.EventArgs)


نحوه raise کردن event( در VB.net):


RaiseEvent SubmitClick(sender, e)

Chabok
سه شنبه 04 اسفند 1388, 13:55 عصر
حالا آیا روشی هست که بدون اینکه کاربر پیغامی ببینه بعد از اجرا شدن سطر اول یعنی textbox1.text="aaa" صفحه منتظر بمونه تا کاربر دکمه ای رو کلیک کنه و بعد از کلیک شدن دکمه برنامه ادامه کد رو اجرا کنه؟
@saghari :
خیر . چنین امکانی در وب موجود نیست .

شما اگر کاری که میخواهید انجام بدین را شرح بدید بهتر میشه راهنمایی کرد .

saghari
سه شنبه 04 اسفند 1388, 14:21 عصر
ضمن تشکر از هر دو بزرگوار و پوزش بابت اینکه شاید سوال هام اصولی نباشن.
در مورد اینکه چرا این سوال رو کردم :
در واقع من دارم خودم یه کنترل برای ارسال پیغام جهت تایید عملیاتی مثل حذف مینویسم (البته میدونم در کنترل های ajax و یا telerik این کنترل هست ولی خواستم خودم براش کد بنویسم)
من کنترل روی صفحه میذارم و وقتی قرار بشه پیغامی به کاربر داده بشه یا سوالی ازش بشه (مثلا قبل از حذف و یا نشان دادن موفقیت عملیات بعد از حذف) ، متغیرهای لازم رو به کنترل میفرستم (مثل پیغامی که باید نمایش داده بشه ، آیکن پنجره پیغام و یا دکمه هایی که باید نمایش داده بشن)
خوب تا اینجا مشکلی نیست.
حالا من باید بعد از اینکه کاربر یکی از دکمه های کنترل رو کلیک کرد با توجه به دکمه کلیک شده یه سروی دستورات رو انجام بدم.
من در ابتدا اومدم بعد از کلیک شدن دکمه در کنترل یک مقدار رو ست کردم. ولی مشکل اینه که باید یجوری بتونم بعد از اینکه کاربر دکمه کنترل رو در فرم کلیک کرد یکسری کد رو اجرا کنم ولی نمیدونم کجا و چجوری.
در مورد توضیح دوستمون هم من برای ایجاد ایونت مشکلی ندارم. ولی آیا میشه ایونت یوزر کنترل رو جوری تعریف کرد که وقتی کاربر در فرم کلیک کرد و اون ایونت اجرا شد بطور خودکار یکسری کد در فرم اجرا بشه؟

بازهم از توجه شما ممنونم

naeeme
سه شنبه 04 اسفند 1388, 14:59 عصر
شما با یه دکمه چطور رفتار می کنید؟ وقتی کاربر یه دکمه رو فشار میده در واقع یک event هست که raise میشه. شما برای اون event یک تابع می نویسید که با raise شدن event اون تابع فراخوانی و اجرا بشه.
اینجا هم دقیقا همون کار رو باید انجام بدید. با raise شدن event باید تابع متصل شده به اون event اجرا بشه.
اگر توضیحات کافی نیست، بفرمایید که دقیقا کجا رو خوب توضیح ندادم تا بهتر توضیح بدم.

برای مثال، این کد مربوط به یک usercontrol هست:


Partial Class UserControl_login
Inherits System.Web.UI.UserControl
Public Event SubmitClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSubmit.Click
If checkData() Then
RaiseEvent SubmitClick(sender, e)
End If
End Sub
End Class

و این هم کدی هست که در فرم قرار گرفته و مربوط به usercontrol هست:



Protected Sub uscLogin1_SubmitClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles usclogin.SubmitClick
checkLogin()
End Sub

saghari
سه شنبه 04 اسفند 1388, 16:59 عصر
سلام
کمک بسیار بزرگی کردید.
شاید خنده دار باشه ولی مشکل من این بود که handle رو در فرم درست نمیذاشتم.
بازم از لطف و راهنمایی شما ممنونم.
انشاء الله تا یکی دو روز دیگه که کد کنترل کامل شد اونو مینذارم همینجا تا هم اگه اشکالی داشت راهنمایی کنید و هم نظرتون رو بدید. (شایدم به درد سایر دوستان هم بخوره)

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

saghari
سه شنبه 04 اسفند 1388, 19:39 عصر
خوشبختانه کمی وقت پیدا کردم و همین امروز تمومش کردم.
توضیح : برنامه زیر یک Web User Control هست که برای نمایش پیغام و هم بصورت کانفریم فرم قابل استفاده هست.
44582

ممنون میشم اگه فرصت داشتید نظرتون رو راجب به او بگید.

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