PDA

View Full Version : سوال: مقدار دهی به progressbar از طریق کلاس



milad_zare
جمعه 16 اسفند 1392, 08:38 صبح
با سلام
یک progressbar در فرم report وجود دارد . عملیات درون این فرن در یک کلاس به نام acion صورت می گیرد . من می خواهم همزمان با انجام عملیات در کلاس action progressbar اسن فرم value جدید بگیرد . روشهای مختلفی را امتحان کردم که جواب نداد . در صورتیکه راه حلی هر چند تئوریک به ذهن دوستان می رسد بفرمیایید تا بنده استفاده کنم .
متشکر

Davidd
جمعه 16 اسفند 1392, 13:22 عصر
من اینکارو با استفاده از event ها انجام دادم که یه کم پیچیدس! . داخل کلاس action، یه event تعریف کن (این event واسه اینه که از خارج کلاس بفهمی باید به progressbar مقدار جدید بدی) بعد متغیر Value (همان مقدار progressbar) به صورت یه پروپرتی پابلیک تعریفش کن. داخل و انتهای متد set این پروپرتی، event ای که تعریف کردی صدا بزن. حالا داخل کلاس هرجا لازمه به value مقدار بده.
حالا یه نمونه ازکلاس action بساز. یه متد به اون event اضافه کن و داخلش مقدار progressbar با استفاده از Value بروز کن و در انتها دستور Application.DoEvents() را بنویس.
این راه حل اصولیشه که دیگه کلاس action به progressbar وابسته نیست.
اگه این راه سخته داخل کلاس action به progressbar مقدار بده و دستور Application.DoEvents() بنویس ( اگه این دستورو ننویسی تا انتهای کار مقدار progressbar پدیت نمیشه)

milad_zare
جمعه 16 اسفند 1392, 18:09 عصر
راه دوم جواب نداد و مقدار progressbar هیچ تغییری نکرد .
راه اول را هم هنوز نتونستم پیاده کنم .

Davidd
یک شنبه 18 اسفند 1392, 08:54 صبح
داخل كلاس action:
Progress مقدار progressbar هست كه در داخل كلاس مقدارش آپديت مي شود. داخل كلاس بايد مقدار Progress را آپديت كني كه باعث مي شود رخداد OnChangeProgress؛ raise شود.


class Action{
public event EventHandler OnChangeProgress;
int _progress;
public int Progress { get { return _progress; }
set
{
_progress = value;
if (OnChangeProgress != null)
OnChangeProgress(this, new EventArgs());
}
}
....
}



حالا در خارج از كلاس يه نمونه از كلاس Action مي سازي و متد مورد نظرتو صدا مي زني كه باعث ميشه Progress آپديت بشه.


Action action1=new Action();
action1.OnChangeProgress += new EventHandler(action1_OnChangeProgress);
//call your method

void action1_OnChangeProgress(object sender, EventArgs e)
{
progressBar1.Value = (sender as Action).Progress;
}