PDA

View Full Version : مشکل با یوزر کنترل Postback دار بدون ViewState



Chabok
شنبه 29 دی 1386, 08:06 صبح
با عرض سلام خدمت دوستان عزیز(خواهشمند است به انشای زیر توجه فرمایید)
من باید یک MasterDetail ساده رو با یک یوزر کنترل ساده پیاده کنم.
این کار توسط دو DropDown انجام میشه .
اولی گروه های کاربری است و دومی کاربران هر گروه که با توجه به اولی پر می شود .(هر دو از دیتابیس)

DropDown اول AutoPostBack می باشد و با تغییر کردن میخواهم دومی را پر کنم .

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

من در نهایت میخواهم کاربر انتخاب شده رو که از کمبو دوم انتخاب میشه توسط یک ReadOnly Property ، از نوع عددی که کد کاربر می باشد Return کنم


Public ReadOnly Property SelectedUser() As Integer
Get
Return Combo1.SelectedValue
End Get
End Propertyکارایی این Property کاملا به رویدادهای پر کردن کمبوها بستگی داره و همیشه جواب نمیده.
(مقدار انتخاب شده رو نمیده . مقدار اولین آیتم رو میده).

سوالات :
آیا باید کمبو اول رو در FormLoad پر کرد و کمبو دوم را در Combo1_Changed ؟ (نشد)
آیا باید از تابع CreateChildControls() استفاده کنم ؟ (یکمی شد ولی کامل نشد)
آیا استفاده از Combo1_Changed توصیه می شود یا مقدار تغیییر کرده را در Load جدید بدست بیارم ؟

مشکلاتی که به آن برخورد کردم :
در تابع CreateChildControls() مقدار انتخاب شده کمبو اول بدست نمیاد تا باهاش کمبو دومی را پر کنم
هنگامی که در Page_Load کمبو دوم را پر می کردم هنگام پست بک شدن صفحه مقدار انتخاب شده از دست می رفت

روشی که ناقص جواب گرفتم :
اگر در CreateChildControls() کمبو اول را پر کنم در Combo1_Changed مقدار آن بدست می آید .
و با آن می توانم کمبو دوم را پر کنم . ولی هنگامی که صفحه پست بک می شود کمبو دوم خالی می شود
و بنابراین مقدار آن هم می پرد . (چون کمبو دوم در هنگام لود شدن صفحه پر نشده است)

راه حل های مطرح شده:
یکی استفاده از CreateChildControls() است که در هنگام کلیک کردن یک Button در یوزر کنترل مطرح شد
یکی استفاده از رویدادهای سمت والد است . یعنی با نوشتن Event در یوزر کنترل سمت والد آن را هندل کنیم .
(این روش اصلا مناسب کار من نیست . من این یوزر کنترل را در بیش از 10 فرم احتیاج دارم)

در ضمن خود والد یک یوزر کنترل است که بصورت داینامیک لود شده . ولی همین یوزر کنترل کاربرها بصورت عادی در یوزر کنترل والد می باشد .

از دوستان تقاضای راهنمایی و کمک دارم .
ممنون و سپاسگزار

Chabok
شنبه 29 دی 1386, 08:54 صبح
با سلام .
جناب راد در یک تاپیکی یک توضیح مختصر در مورد IPostBackDataHandler داده بودند .
IPostBackDataHandler Interface (http://msdn2.microsoft.com/en-us/library/system.web.ui.ipostbackdatahandler.aspx)
آیا به این تاپیک ربطی داره ؟
اگر امکانش هست رویدادهای مناسب برای سوال بالا رو در این روش بیان بفرمایید .

ممنونم

mahdi_farhani
شنبه 29 دی 1386, 09:02 صبح
یه بررسی بکن ، ببین Id تکراری در Dropdown ها نداشته باشی.
میتونی یه کار دیگه هم بکونی یه متغییر Shared در نظر بگیر که بعد از انتخاب DropDown کاربران پست بک میشه و این متغییر مقدار دهی میشه . بعد از اون میتونی درون Property اونو برگردونی .

Chabok
شنبه 29 دی 1386, 09:11 صبح
سلام

یه بررسی بکن ، ببین Id تکراری در Dropdown ها نداشته باشی.

اصلا دو تا DropDown بیشتر ندارم . ID شون یکی نیست


میتونی یه کار دیگه هم بکونی یه متغییر Shared در نظر بگیر که بعد از انتخاب DropDown کاربران پست بک میشه و این متغییر مقدار دهی میشه . بعد از اون میتونی درون Property اونو برگردونی .
امتحان میکنم . ولی کمبو کاربران اصلا مقداری بر نمیگردونه . و ریست میشه

mahdi_farhani
شنبه 29 دی 1386, 09:14 صبح
منظورم از ID همون ValueField بود .

scorpion_man
یک شنبه 30 دی 1386, 02:20 صبح
سلام به همه دوستان

راهش خیلی ساده هست

اولا viewstate مخصوصا combo اولی رو false نکن چون اطلاعات از دست میره

ثانیا تو load event باید combo اولی رو پر کنی فقط با این تفاوت که توابع پر کردن رو داخل شرط
if not page.ispostback بذاری تا اطلاعات از بین نرن
بقیه کارا رو همونطور که انجام دادی درستن
این کارا کاملا مشکلاتتو برطرف میکنه اگه نشد من این کدها رو تو یکی از module هام نوشتم اگه نتونستی بگو کدها رو برات اینجا بذارم

موفق باشید

Chabok
یک شنبه 30 دی 1386, 06:23 صبح
سلام
ممنونم دوست عزیز
از آقای فرهانی + بهروز راد هم تشکر میکنم
مشکل اصلی ViewState بود(مشکل خاصی نبود).
چون در فرم والد فعال نبود میخواستم به یک نحوی بدون ویو استیت انجام بدم.
که ظاهرا نشد .
با فعال کردن ViewState در این قسمت حل شد .

ممنون از همگی .