PDA

View Full Version : کنترل زمان اعمال تغییرات در RunTime



omid_Ahmadi
پنج شنبه 19 مرداد 1385, 18:04 عصر
سلام،
وقتی در زمان اجرا ویژگی های یه کنترل رو تغییر می دیم، فرضا BackColor اون رو عوض می کنیم، بلافاصله این تغییر اعمال میشه.
توی یه فرمی می خوام تغییرات زیادی رو انجام بدم و بعد که همه انجام شدن، فرم رو دوباره رسم کنم و در طول این مدت هم می خوام فرم به همون صورت قبل از شروع تغییرات باشه (فرضا با تغییر علامت کرسر مشخص بشه که فرم در حال پردازشه). چه طور می تونم از تغییر بلافاصله ی ویژگی های کنترل های روی فرم جلوگیری کنم و در زمان مورد نظر این کار رو انجام بدم؟

ممنون

ghafoori
جمعه 20 مرداد 1385, 10:39 صبح
دوست عزیز پیشنهاد من این است که از یک تایمر استفاده کنید که مثلا بعد از چند ثانیه تغییرات را اعمال کند

omid_Ahmadi
جمعه 20 مرداد 1385, 14:23 عصر
فکر کنم منظور من رو درست متوجه نشدید، من می خوام تا زمانی که تغییرات کاملا اعمال نشده، در فرم نشون داده نشه. با تایمر نمیشه از اعمال تغییرات در فرم جلوگیری کرد (یا شاید هم من منظور شما رو درست متوجه نشدم).

KingOfDotNet
جمعه 20 مرداد 1385, 14:48 عصر
قبل از اینکه تغییرات رو انجام بدی متد this.SuspendLayout رو صدا بزن.
بعد از اعمال تغییرات متد this.ResumeLayout رو صدا بزن تا تغییرات اعمال شود.
در ضمن این جور مو قع ها هیچوقت با تایمر و .... ماست مالی نکن.



private void AddButtons()
{
// Suspend the form layout and add two buttons.
this.SuspendLayout();
Button buttonOK = new Button();
buttonOK.Location = new Point(10, 10);
buttonOK.Size = new Size(75, 25);
buttonOK.Text = "OK";


Button buttonCancel = new Button();
buttonCancel.Location = new Point(90, 10);
buttonCancel.Size = new Size(75, 25);
buttonCancel.Text = "Cancel";


this.Controls.AddRange(new Control[]{buttonOK, buttonCancel});
this.ResumeLayout();
}

Farhad.B.S
جمعه 20 مرداد 1385, 15:58 عصر
البته لازم به ذکره که متد SuspendLayout فقط برای نگهداری خصوصیاتی مثل سایز ، محل کنترل و ... به کار میره.
در واقع درصورتیکه این متد رو صدا بزنید و سپس خصوصیت BackColor فرم رو تغییر بدید بدون توجه به کال شدن SuspendLayout تغییرات بلافاصله اعمال میشه و منتظر متد ResumeLayout نمیمونه.
به هر صورت اگه Suspend/Resume جوابگو نبود فکر میکنم بتونی با آوررید کردن متد OnPaint یه کارایی انجام بدی.

omid_Ahmadi
جمعه 20 مرداد 1385, 19:28 عصر
متد SuspendLayout و ResumeLayout همونطور که جناب Farhad.B.S گفتن جواب نمیده،
در مورد اورراید کردن متد OnPaint هم، راستش روش پیچیده ایه می خوام اگر بشه یه روش ساده تر پیدا کنم.

Farhad.B.S
جمعه 20 مرداد 1385, 21:33 عصر
اگه به دنبال روشی هستید که مورد ساپورت فریمورک باشه فکر نمیکنم چنین چیزی موجود باشه.
روش های فرعی و غیر استاندارد زیادی وجود داره، مثلا انداختن یک کنترل پوشش دهنده مثل Panel بر روی فضای مورد تغییر ؛ تغییر خصوصیات فرم و نهایتاً حذف کنترل پوشش دهنده.

omid_Ahmadi
شنبه 21 مرداد 1385, 05:57 صبح
توی این فرم من می خواستم کنترلهای موجود رو Dispose کنم و یه سری کنترل جدید قرار بدم. قبلا با این که اول کنترل ها رو کامل ایجاد می کردم بعد به فرم اضافه می کردم باز هم فرم به اون صورتی که مورد نظر بود تغییر نمی کرد یعنی کنترلها تک تک نشون داده میشدن. این مرتبه قبل از اضافه کردن کنترل ها به فرم از SuspendLayout استفاده کردم و بعد هم ResumeLayout. به این ترتیب به این ترتیب کنترل های جدید همه با هم توی فرم نمایش داده می شن.

dot_net_lover2
شنبه 21 مرداد 1385, 08:58 صبح
به نظر من واسه خصوصیاتی مثل BackColor میتونی از یک آرایه یا لیست استفاده کنی ٬‌بدین صورت که این لیست تمام خصوصیاتی را که باز تا اونجا که متوجه شدم در فرم Setting خود تغییر دادی را در خود قرار داده(To Do List) و حالا با Apply شدن Change setting ها میتونی پشت سر هم موارد درون لست را اعمال کنی.

omid_Ahmadi
شنبه 21 مرداد 1385, 10:55 صبح
فکر کنم صورت مسئله رو کامل نخوندی

dot_net_lover2
شنبه 21 مرداد 1385, 14:07 عصر
دوباره خوندم با قبلا تفاوتی نکرد میشه بگی کجا را خوب متوجه نشدم.