PDA

View Full Version : ایجاد کنترلها به شکل Dynamic



سار
سه شنبه 25 دی 1386, 15:53 عصر
من یک سری کنترل رو با کد ایجاد میکنم ولی وقتی صفحه میره به PostBack اونها از بین میرن چطور باید جلوی این اتفاق رو بگیرم؟!

Behrouz_Rad
سه شنبه 25 دی 1386, 17:52 عصر
این مشکل برای خیلی ها پیش میاد.
این یک برخورد منطقی و طبیعی هست و به نحوه ی چرخه ی حیات یک صفحه در ASP.NET بر میگرده.
روال هایی که میشه در چرخه ی حیات یک صفحه ازشون به ترتیب اجرا نام برد شامل:
1) Initialization
LoadViewState (2
LoadPostDackData (3
Load (4
RaisePostBacKEvent (5
SaveViewState (6
Render (7

همون طور که می بینی، تازه در مرحله ی پنجم هست که روالی که موجب PostBack صفحه شده فراخوانی میشه اما یک کنترل در مراحل 1 تا 4 ساخته میشه. پس اگر کنترلی رو با شرط Not IsPostBack ایجاد کنی، کنترلی وجود نداره تا روال Click اون فراخوانی بشه!

راه حل این مشکل اینه که در هر زمان که PostBack ای رخ میده، روال ایجاد کنترل های Dynamic رو فراخوانی کنی. بهترین مکان برای فراخوانی این روال، رویداد LoadViewState هست. این رویداد رو Override کن: ;(base.LoadViewState(savedState
و سپس روال ایجاد کنترل های Dynamic رو فراخوانی کن.

چند تا نکته ای دیگه هم در مورد ایجاد کنترل های Dynamic باید در نظر بگیرید:
1) کنترل های Dynamic رو همیشه به یک PlaceHolder اضافه کنید. در ابتدا حتما متد Clear کلاس Controls کنترل PlaceHolder رو فراخوانی کنید تا کنترل هایی که قبلا به اون انتساب داده شدن حذف بشن.
2) همیشه به کنترل های Dynamic یک ID نسبت بدید. اگر این کار رو نکنید، ASP.NET به طور خودکار به کنترل های Dynamic یک ID اختصاص میده و این ID ممکنه در هر PostBack تفاوت داشته باشه. بهتره بدونید که با وجود ID هست که تشخیص داده میشه کدام کنترل موجب رخ دادن PostBack شده.
برای کنترل هایی که هم نوع هستند و با هم ایجاد میشن (مثلا در یک حلقه ی For) طریقه ی نسبت دادن ID مهم هست. بدین شکل عمل کنید:


for (i = 0; i < 5; i++)
{
myDynamicControl.ID = "Salam_" + i;
}

موفق باشید.

Arian_61
شنبه 09 شهریور 1387, 10:35 صبح
راه حل این مشکل اینه که در هر زمان که PostBack ای رخ میده، روال ایجاد کنترل های Dynamic رو فراخوانی کنی. بهترین مکان برای فراخوانی این روال، رویداد LoadViewState هست. این رویداد رو Override کن: ;(base.LoadViewState(savedState

salam khaste nabashid man inkaro kardam hala to lod safham contorolam az bin nmire vali hanooz baejray revalam khata migire



protectedoverridevoid OnLoad(EventArgs e)
{

base.LoadViewState(savedState);
base.OnLoad(e);
Button btn = newButton();//دکمه اول
btn.Text = "Test";
btn.OnClientClick = "SabtNanar";//فراخوانی ایونت
btn.ID = "btntsti";
PlaceHolder1.Controls.Add(btn);

PlaceHolder1.Controls.Add(newLiteralControl("&nbsp;&nbsp;"));//فاصله

btn = newButton();//دکمه دوم
btn.Text = "Test 2";
PlaceHolder1.Controls.Add(btn);
}
protectedvoid SabtNanar(object sender, EventArgs e)
{
Label1.Text = "Test succse";
}

inam khatash :
'savedState' does not exist in the current context

Arian_61
شنبه 09 شهریور 1387, 10:42 صبح
من جوابم و پیدا کردم می زارم شاید به بقیه کمک کنه :قلب:



protectedoverridevoid OnLoad(EventArgs e)
{
//base.LoadViewState(savedState);
base.OnLoad(e);


Button btn = newButton();//دکمه اول
btn.Text = "Test";
btn.Click += new System.EventHandler(this.SabtNanar);
//btn.OnClientClick = "SabtNanar";
btn.ID = "btntsti";
PlaceHolder1.Controls.Add(btn);


PlaceHolder1.Controls.Add(newLiteralControl("&nbsp;&nbsp;"));//فاصله


btn = newButton();//دکمه دوم
btn.Text = "Test 2";
PlaceHolder1.Controls.Add(btn);
}
protectedvoid SabtNanar(object sender, EventArgs e)
{
Label1.Text = "Test succse";
}

naeeme
چهارشنبه 24 مهر 1387, 19:11 عصر
بعد از اضافه کردن این کنترل‌های داینامیک،‌به چه روشی میشه بهشون دسترسی داشت و با اونها کار کرد؟
من page.findcontrol رو امتحان کردم اما جواب نداد.

milade
پنج شنبه 25 مهر 1387, 06:18 صبح
بعد از اضافه کردن این کنترل‌های داینامیک،‌به چه روشی میشه بهشون دسترسی داشت و با اونها کار کرد؟

یعنی چی کار کرد؟
اگه منظورتون تغییرات هست که دوستمون نوشتن:

Button btn = newButton();//دکمه اول
btn.Text = "Test";

می بینید که دوستمون متن رو تغییر داده!!!
اگه جوابتون این نیست لطف کنید شفاف تر بیان کنید
موفق باشید

naeeme
پنج شنبه 25 مهر 1387, 10:14 صبح
به نظر خودم که شفاف گفتم!
منظورم این هست که توی یه حلقه 20 تا textbox ایجاد می کنم. پس از postback شدن صفحه، حالا می خوام به txtName02.text دسترسی داشته باشم که txtName02 یک کنترل داینامیک هست که قبل از postback به صفحه اضافه شده و در حال حاضر هیچ اشاره‌گری به اون در دست برنامه نیست. پس از روش بالا نمیشه به اون دسترسی داشت.

حالا متوجه شدین؟؟

naeeme
پنج شنبه 25 مهر 1387, 10:42 صبح
خوب! یه توصیه باید به خودم بکنم دیگه!! هر وقت خسته ام کار برنامه نویسی رو باید بذارم کنار!!

جواب سوالم اینه:
توی کنترل های اضافه شده به کنترلی که این کنترل های داینامیک رو بهش اضافه کردم، دنبالشون بگردم!!
(چی گفتم!!) منظورم اینه که اگه این کنترل های داینامیک رو به یه placrholder اضافه کرده‌ام، توی plc.Contrils دنبالشون بگردن نه اینکه از page.findcontrol استفاده کنم!!

peymannaji
پنج شنبه 25 مهر 1387, 13:18 عصر
با سلام .
یک سوالی که برای بنده پیش اومده و خیلی دنبالش هستم مسئله CMS هاست .

ببینید در مورد مسئله ای که دوستمون بیان کردند و آقای راد جواب دادند اون روالی که کنترل های داینامیک رو ایجاد میکنه کاملا ثابت هست . یعنی اگر تو اون رویداد میگه 20 تا تکست باکس ایجاد کن ایجاد میکنه و هر بار هم اون روال انجام بشه فقط 20 تا تکست باکس ایجاد میشه نه زیاد نه کم .

اما مسئله اصلی اینجاست اگر ما بخواهیم اون روال هم داینامیک باشه چکار باید کرد . یک مثال میزنم . ببینید اگه CMS ها رو دیده باشید بفرض مثال میگید که در صفحه "ارتباط با ما" 4 تا تکست باکس ایجاد کن که کاربر مشخصاتشو بنویسه + یک Drop Down list که از اون تحصیلاتشو انتخاب کنه . حالا سایت به همین منوال هربار که صفحه ارتباط با ما لود میشه همین کنترل ها رو لود میکنه . اما !!! 2 روز بعد شما تصمیم میگیرید 2-3 تا کنترل کم یا زیاد کنید ! که در CMS میایم براحتی اینکار رو انجام میدیم و از سری بعد روال جدید ایجاد میشه نه قدیمی . در واقع مسئله ایجاست . از آنجایی که ما به کدهای آن CMS دسترسی نداریم که روال ایجاد کنترل داینامیک رو تغییر بدیم درنتیجه روند کار در اینگونه موارد چگونه است ؟

saraIT
پنج شنبه 02 آبان 1387, 11:29 صبح
اگه نشه تو pageload اينها رو به صورت دايناميك ساخت و توي يك تابعي ديگه اين كنترل ها رو بسازيم بعد مثلا اگه چك باكس باشه و بخواهيم از check box check آن با فشردن يك Button آگاهي پيدا كنيم چه كار بايد بكنيم چون اصلا نه مي مي تونه كنترل رو توي Place holder پيدا كنم ونه event check cheng كار مي كنه


( protected void Page_Load(object sender, EventArgs e

}
if (!IsPostBack)
{
main();
}
main()
{

}
foreach (...........)
‍‍‍{
cbx = new CheckBox();
cbx.CheckedChanged += new System.EventHandler(this.cbx_CheckedChanged);
cbx.ID ="cbx";

cbx.CssClass=foldername;
cbx.AutoPostBack = true;
PlaceHolder1.Controls.Add(cbx
);


{{


protected void cbx_CheckedChanged(object sender, EventArgs e)
{
string f = "1";
Response.Write(f);
}
protected void Button1_Click(object sender, EventArgs e)
}

(" CheckBox cbx=(CheckBox)PlaceHolder1.FindControl("cbx


{

if (check.Checked)

code//}
{