PDA

View Full Version : پاس دادن پارامتر هنگام Load یوزر کنترل



Ali1400
شنبه 26 دی 1388, 19:08 عصر
سلام دوستان
در پروژه من:
_ یک صفحه وجود دارد به نام main.aspx که در آن دو تکست باکس به نامهای textbox1 و textbox2 و یک باتن به نام button1 و دو placeholder به نامهای placeholder1 و placeholder2 موجود است
_ یک یوزر کنترل وجود دارد به نام html.ascx که در آن فقط یک لیبل به نام label1 موجود است

حالا من می خواهم وقتی که در صفحه main دو تکست باکس را با رشته هایی پر میکنم(مثلا اولی را با رشته "علی" و دومی را با رشته "احمد") و باتن button1 را کلیک می کنم آنگاه:
یوزر کنترل html.ascx در هر دو placeholder1 و placeholder2 به صورت داینامیک لود بشود و در هر placeholder مقدار متفاوتی را نمایش دهد(در placeholder1 مقدار textbox1 که "علی" می باشد و در placeholder2 مقدار textbox2 که "احمد" می باشد)

من روش لود داینامیک یوزر کنترل را می دانم ولی نحوه لود یوزر کنترل را با استفاده از مقادیر دریافتی از صفحه والد یا چیزی شبیه این را نمی دانم ، ظاهرا باید یک کلاس ایجاد کنم که این کار را انجام دهد. از مطالعه cms های اپن سورس هم چیزی سر درنیاوردم. در حقیقت می خواهم کاری را که cms ها از آن طریق انواع یوزر کنترلها را به هر تعداد در صفحه لود می کنند را یاد بگیرم.
توجه: هدف نهایی ارسال پارامتر (مثلا یک id ) به یوزر کنترل می باشد تا یوزر کنترل بر اساس آن پارامتر کدهای خود را(مثلا واکشی داده) انجام دهد و در صفحه ای که به صورت داینامیک لود می شود ظاهر شود که در اینجا ممکن است از آن یوزر کنترل چند تا در صفحه با مقادیر مختلف لود شوند پس هر کدام پارامتر متفاوتی را دریافت می کنند.

لطفا در صورت امکان با یک مثال کمکم کنید(دات نت 2 هم در نظر گرفته شود).
با تشکر

Chabok
یک شنبه 27 دی 1388, 11:18 صبح
با سلام

اگر توسط متد LoadControl یک userControl را Load می کنید می توانید یک آرایه از اشیاء به عنوان پارامتر به Constructor یوزر کنترل خود ارسال کنید .

این کد را به عنوان یک Constructor به یوزر کنترل اضافه کنید :
فرض میکنیم سه پارامتر لازم داریم :


public myUserControl (string s, bool b, int i){
// constructor code here
}


عنایت دارید که Constructor باید Public باشد و همنام کلاس باشد .

سپس برای Load کردن userControl توسط این پارامترها بصورت زیر عمل کنید :


object[] myParameters = {"test", true, 3};

MyPH.Controls.Add(LoadControl("MyUC.ascx", myParameters));

پارامتر دوم متد LoadControl به Constructor یوزر کنترل ارسال می شود .

موفق باشید .

Ali1400
یک شنبه 27 دی 1388, 17:12 عصر
دوست عزیز بسیار ممنون از راهنماییتان.
چون من حرفه ای نیستم خواهشن در صورت امکان یک مثال کامل (ترجیحا یک پروژه یا لیست کامل کدها ی استفاده شده) برام بذارید.
در ضمن یک سوال دارم:
وقتی که در پروژه ما چندین یوزر کنترل وجود دارد که هر کدام هم ممکن است در یک صفحه چندین بار لود بشوند و ما هم بنا به محتواهایی که باید در صفحه نشان دهند باید مثلا id آن یوزر کنترل را هنگام لود آن یوزر کنترل به عنوان پارامتر به آن پاس دهیم(تا یوزر کنترل بوسیله آن id محتوای خاص خود را نمایش دهد) و بخواهیم که (جهت کم کردن کد و دوباره استفاده بردن از کد نوشته شده) کد:

public myUserControl (string s, bool b, int i){
// constructor code here
}
را که توضیح دادید در یک کلاس بنویسیم و فقط در ابتدای هر یوزر کنترل با صدا کردن آن کلاس بتوانیم پارامتر را بخوانیم ، آنوقت نحوه نوشتن آن کلاس و اسفاده آن در صفحات چگونه است؟
در صورت امکان یک مثال کامل بزنید ، آخه من که مثل شما حرفه ای نیستم.

با تشکر از توجه شما

Ali1400
دوشنبه 28 دی 1388, 15:21 عصر
من از کد ذکر شده نتوانستم استفاده کنم و از کد

object[] myParameters = {"test", true, 3};

MyPH.Controls.Add(LoadControl("MyUC.ascx", myParameters));

ایراد می گیره .
لطفا در صورت امکان یک مثال کامل بذارید.

Chabok
دوشنبه 28 دی 1388, 21:06 عصر
با سلام

ظاهراً Overload دوم متد LoadControls که پارامتر به Constructor ارسال می کند یه چیزیشه http://forum1.free-offline.com/images/smilies/24.gif

بنابراین توسط متد LoadControl معرفی شده در این مقاله جلو می رویم
http://blah.winsmarts.com/2006/05/20/loadcontrol-a-usercontrol--and-pass-in-constructor-parameters.aspx

این تابع بدین صورت است که با نام MyLoadControl استفاده کرده ایم :


private UserControl MyLoadControl(string UserControlPath, params object[] constructorParameters)
{
List<Type> constParamTypes = new List<Type>();
foreach (object constParam in constructorParameters)
{
constParamTypes.Add(constParam.GetType());
}

UserControl ctl = Page.LoadControl(UserControlPath) as UserControl;

// Find the relevant constructor
ConstructorInfo constructor = ctl.GetType().BaseType.GetConstructor(constParamTy pes.ToArray());

//And then call the relevant constructor
if (constructor == null)
{
throw new MemberAccessException("The requested constructor was not found on : " + ctl.GetType().BaseType.ToString());
}
else
{
constructor.Invoke(ctl, constructorParameters);
}

// Finally return the fully initialized UC
return ctl;
}


از این به بعد جهت Load کردن UserControl از این تابع استفاده می کنیم .

بقیه کار ساده است و طبق توضیحات پست قبلی می باشد .

در این مثال یک UserControl داریم که دو Constructor دارد .

یکی به صورت پیش فرض و یکی دیگر که دو پارامتر می گیرد .
قرار است متن و رنگ یک Label هنگام Load به این userControl ارسال شود .


public MyLabel()
{

}
public MyLabel(string text, string color)
{
Label1.Text = text;
Label1.ForeColor = System.Drawing.Color.FromName(color);
}در صفحه اصلی دو عدد Button قرار می دهیم که قرار است هر کدام مقادیر متفاوتی را به UserControl ارسال کرده و آن را Load نمایند .


protected void Button1_Click(object sender, EventArgs e)
{
object[] myParameters = new object[] { "Salam", "Black" };
PlaceHolder1.Controls.Add(MyLoadControl("MyLabel.ascx", myParameters));
}
protected void Button2_Click(object sender, EventArgs e)
{
object[] myParameters = new object[] { "Barnamenevis", "Red" };
PlaceHolder1.Controls.Add(MyLoadControl("MyLabel.ascx", myParameters));
}http://barnamenevis.org/forum/attachment.php?attachmentid=42750

پروژه ضمیمه شده است .

موفق باشید .

Ali1400
سه شنبه 29 دی 1388, 16:50 عصر
کاش می شد همینطور دکمه تشکر را می زدم ،دوست عزیز بسیار ممنون ، مشکلم را حل کردی.

حالا دو سوال دارم:
1- میشود آن قسمت از کد یوزر کنترل که پارامترها را دریافت می کند را به صورت یک کلاس یا یک همچین چیزی درآورد تا یوزر کنترلهای دیگر هم بتوانند با صدا زدن آن کلاس یا ارث بردن از یوزر کنترل اصلی به آن پارامترها دستیابی داشته باشند(مثل دات نت نیوک یا سایر cmsها)؟ در صورت امکان راهنمایی کنید.
2- این روش باری به سیستم نمی آورد(فرض کنید برای هر صفحه بخواهیم بیش از بیست یوزر کنترل را لود کنیم ، در حقیقت روش بهتری هم ممکن است باشد؟

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

Chabok
سه شنبه 29 دی 1388, 21:36 عصر
کاش می شد همینطور دکمه تشکر را می زدم ،دوست عزیز بسیار ممنون ، مشکلم را حل کردی.

خواهش میکنم . اتفاقاً بحث خوبی بود . خودم هم چند بار بهش فکر کرده بودم . ولی سراغش نرفته بودم .



1- میشود آن قسمت از کد یوزر کنترل که پارامترها را دریافت می کند را به صورت یک کلاس یا یک همچین چیزی درآورد تا یوزر کنترلهای دیگر هم بتوانند با صدا زدن آن کلاس یا ارث بردن از یوزر کنترل اصلی به آن پارامترها دستیابی داشته باشند(مثل دات نت نیوک یا سایر cmsها)؟ در صورت امکان راهنمایی کنید.

امکان ارث بری از UserControl که فراهم است .
ولی در صورتی که همه یوزر کنترل ها از لحاظ تعداد پارامتر مشابه هستند و مثلاً همه یک ID می گیرند لازم به ارث بری نیست .
از همین طریق می توانید یک پارامتر به همگی ارسال کنید ، بدون توجه به نوع و نام پارامتر هر یوزر کنترل .



2- این روش باری به سیستم نمی آورد(فرض کنید برای هر صفحه بخواهیم بیش از بیست یوزر کنترل را لود کنیم ، در حقیقت روش بهتری هم ممکن است باشد؟

خود این روش بار اضافی تحمیل نمی کند .
هر چقدر که Load کردن تعدادی UserControl هزینه بر باشد ، این متد نیز به همان مقدار هزینه بر است .

زیرا تفاوت خاصی با LoadControl خود ASP.net نداره و یک متد گسترش یافته است .

موفق باشید .

iman_ad
سه شنبه 29 دی 1388, 22:01 عصر
به این نوع usercontrol ها itegrated هم گفته می شه شما می تونی یک خصوصیت عمومی هم تعریف کنی و توی page مقدار بدی یا بخونی

Ali1400
سه شنبه 29 دی 1388, 22:42 عصر
لطفا در مورد itegrated و نحوه ارسال و دریافت خصوصیت یا پارامتر بیشتر توضیح بدهید(ترجیحا با مثال).

پاسکال 1
پنج شنبه 14 بهمن 1389, 19:15 عصر
به نام خدا

با سلام خدمت دوست عزیز جناب Chabok من برای مشکلم که همین مشکل بالا بود همین روش رو انجام دادم حالا چطور می تونم به Property های اون UserControl بالایی دسترسی داشته باشم چون من تو UserControl خودم می خوام مقدارش رو تو صفحه aspx خودم بگیرم و تو بانک ذخیره کنم.
البته من در این تاپیک هم سئوالم رو مطرح کردم
http://barnamenevis.org/showthread.php?273108-%D8%B3%D8%A7%D8%AE%D8%AA%D9%86-%D9%88-%DB%8C%D8%A7-%D9%84%D9%88%D8%AF-%DA%A9%D8%B1%D8%AF%D9%86-%DB%8C%DA%A9-UserControl-%D8%AF%D8%B1-%D8%AD%D8%A7%D9%84%D8%AA-RunTime-%D9%88-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%D8%A8%D9%87-%D9%85%D9%82%D8%A7%D8%AF%DB%8C%D8%B1-%D8%AF%D8%A7%D8%AE%D9%84-%D8%A2%D9%86-%D8%AF%D8%B1-%D8%AD%D8%A7%D9%84%D8%AA-Runtime

پاسکال 1
یک شنبه 08 خرداد 1390, 20:32 عصر
به نام خدا
با تشکر از دوست عزیز جناب chabok من می خوام یه کلاس کلی بنویسم و تو اون برای لود UserControl هام با استفاده از روشی که شما نوشتید استفاده کنم ولی یه ایرادی می گیره تو این خط :


UserControl ctl = LoadControl(UserControlPath) as UserControl;

به LoadControl ایراد میگیره و میگه نمی شناسمش
به نظر شما ایراد کار چیه ؟

البته این قسمت رو به صورت یه تابع تو خود صفحه aspx بنویسم مشکلی نداره فقط وقتی می خوام مثل یه کلاس بنویسم که همه جا استفاده کنم ایراد میگیره