PDA

View Full Version : پر شدن progress bar هنگام باز شدن فرم جدید



jd.mn98
دوشنبه 06 مرداد 1393, 21:03 عصر
سلام دوستان
من در برنامم وقتی از صفحه ی اصلی وارد یک فرم دیگه میشم ، لود شدن فرم جدید به دلیل بانک و کنترل های اون مقداری طول میکشه.
می خوام بدونم چطوری میشه که وقتی دکمه رو زدم که به فرم جدید برم در این بازه زمانی انتظار برای لود شدن فرم جدید ، یک progress bar پر بشه و وقتی کامل پر شد فرم به نمایش در بیاد.
من می دونم که باید با بک گراند ورکر این کارو کرد ولی نمیدونم چطوری این کارو انجام بدم ، اگه میشه رانمایی کنید.
با تشکر

ghasem110deh
دوشنبه 06 مرداد 1393, 21:19 عصر
من از این واسه بکاپ گیری استفاده کردم ...
بعد از دستورات مربوط به بانک این کد رو بنویس شاید جواب بده !

progressBar1.PerformStep();
MessageBox.Show("نسخه پشتیبان با موفقیت ایجاد شد","Take Backup",MessageBoxButtons.OK,MessageBoxIcon.Asterisk);
progressBar1.Value = 100;

forodo007
سه شنبه 07 مرداد 1393, 00:58 صبح
progressBar1.Value = 100;
if (progressBar1.Value <progressBar1.Maximum )
progressBar1.Value ++;
else
{


{
if (progressBar1.Value == 100)
{
System.Threading.Thread.Sleep(5000);
Form2 a = new Form2();
a.ShowDialog();




}
}


}

jd.mn98
چهارشنبه 22 مرداد 1393, 19:40 عصر
دوستان بالاخره نفهمیدم باید چیکار کنم.موقعی که دکمه ی ورود به فرم دوم رو میزنم به دلیل بانک و اطلاعات اون ، مقداری طول میکشه تا فرم دوم باز بشه ، حالا میخوام این مدت زمانی که طول میشکه رو یک پروگرس بار پر بشه.باید چیکار کنم و از چه کد هایی استفاده کنم؟؟

حسین.کاظمی
چهارشنبه 22 مرداد 1393, 20:56 عصر
دوست عزیز
سلام
اول توی فرمت یک پروگسس بار بزار بهمراه یک تایمر و کدهای زیر را در رویداد Tick بنویس


this.ProgressBar1.Value += 1;
if (this.ProgressBar1.Value == 50)
{
this.ProgressBar1.Value = 0;
timer2.Enabled = false;
نمایش فرم مورد نظر




امیدوارم که مشکلتو حل کرده باشه!!!

jd.mn98
چهارشنبه 22 مرداد 1393, 21:28 عصر
دوستان فک کنم منظورم رو متوجه نشدین
وقتی روی دکمه فرم دوم کلیک میکنم ، برنامه نزدیک به یک ثانیه طول میکشه تا فرم رو لود کنه و نمایش بده، من میخوام این بازه ی انتظار رو یک پروگرس بار بزارم که روند لود شدن اطلاعات رو نشون بده.

alonmahdi
پنج شنبه 23 مرداد 1393, 00:32 صبح
سلام لینک های زیر رو به ترتیب بخونید جواب شما هستند :
http://www.c-sharpcorner.com/UploadFile/deepak.sharma00/asynchronous-processing-of-database-records-on-a-winform-ui/
http://www.c-sharpcorner.com/UploadFile/deepak.sharma00/how-to-show-progress-of-fetching-database-records-using-a-pr/

alibilgats
پنج شنبه 23 مرداد 1393, 15:07 عصر
دوست خوبم من خودم قبل از شما درگیر همین قضیه بودم! توی همین فروم هم خیلی گشتم و یه سری از دوستان روشهایی رو پیشنهاد داده بودن که خیلی کاربردی نبودن و اکثرشون مشکل داشتن!

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

برای فرم انتظار دوتا حالت وجود داره!

1. توی فرمی که میخوای باز بشه تعدادی رکورد لود میشه که زمان بره! اگه بخوای progressbar بر اساس تعداد رکوردات تنظیم بشه و روند لود شدن رو نشون بده کار کمی سخت میشه! حالا فرض کن بخوای رکوردهاتو از چند جدول واکشی کنی! داستان میشه!

2. حالت دوم اینه که شما یه سری عملیات میخوای انجام بدی و کاربر باید منتظر بمونه تا اون عملیات تموم بشه! حالا میخواد واکشی رکورد باشه یا یه کار محاسباتی یا اتصال به دستگاه! به هر حال چندثانیه طول میکشه!

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

توی روشی که من پیاده سازی کردم و توی پروژه های خودمم استفاده میکنم از یه ProgressBar چرخان استفاده کردم با کمی کد نویسی.

لینک دانلود (http://cld.persiangig.com/download/PVqFuIKXZJ/PleaseWait.rar/dl)

روش استفادش خیلی راحته! واسه همین دیگه توضیح نمیدم.
امیدوارم به دردتون بخوره

jd.mn98
پنج شنبه 23 مرداد 1393, 17:28 عصر
برنامتون بسیار خوب بود ، ولی اگه طوری باشه که با progressbar کار کنه بهتره.

Mahmoud.Afrad
پنج شنبه 23 مرداد 1393, 17:37 عصر
کد فرم دوم که اطلاعات لود میشه رو بزارید.
میشه با دیتاریدر یه کارایی کرد. اگر linqtosql یا ef کار کنی هم راحت میتونی انجام بدی.

jd.mn98
پنج شنبه 23 مرداد 1393, 18:14 عصر
این مدت زمان لود شدن بیشتر برای برای کامپوننت و ابزار های روی فرمه.
حالا اگه کدشو میخواین

private void frmSave_Load(object sender, EventArgs e)
{

fill_dgv();
fill_combo();
fill_combo2();
dgv1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dgv1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
dgv1.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
dgv1.Columns[5].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
dgv1.Columns[4].AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
dgv1.Columns[7].AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
dgv1.Columns[0].HeaderText = "نام";
dgv1.Columns[1].HeaderText = "وضعیت";
dgv1.Columns[2].HeaderText = "وضعیت تأخیر";
dgv1.Columns[3].HeaderText = "مدت تأخیر";
dgv1.Columns[4].HeaderText = "جریمه تأخیر";
dgv1.Columns[5].HeaderText = "تاریخ";
dgv1.Columns[6].HeaderText = "زمان کلاس";
dgv1.Columns[7].HeaderText = "زمان ورود";
lblstatus.Text = " امروز "+md.GetNameDayInMonth() + " " + md.GetNumberDayInMonth().ToString() + " " + md.GetNameMonth() + " ماه " + md.GetNumberYear().ToString();
this.Activate();
}

Mahmoud.Afrad
پنج شنبه 23 مرداد 1393, 18:44 عصر
کد متدهای fill رو هم بزار.

روند کلی به اینصورته که تعداد رکوردها رو بدست میاریم و بعد در حلقه توسط دیتاریدر داده ها رو دریافت میکنیم و در لیست یا دیتاتیبل قرار میدیم و در صورت پیشرفت ، پروگرسبار رو آپدیت میکنیم.

jd.mn98
پنج شنبه 23 مرداد 1393, 22:47 عصر
کد های fill


private void fill_dgv()
{
dt.Clear();
da = new SqlDataAdapter("select * from viewJavad order by date desc , maintime desc", con);
da.Fill(dt);
dgv1.DataSource = dt;
}
private void fill_combo()
{
dtcombo.Clear();
da = new SqlDataAdapter("select * from tblstu", con);
da.Fill(dtcombo);
comboBox2.DataSource = dtcombo;
comboBox2.DisplayMember = "name";
comboBox2.ValueMember = "code";
}
private void fill_combo2()
{
dtcombo.Clear();
da = new SqlDataAdapter("select * from tblstu", con);
da.Fill(dtcombo);
cmbname.DataSource = dtcombo;
cmbname.DisplayMember = "name";
cmbname.ValueMember = "code";
}

Mahmoud.Afrad
جمعه 24 مرداد 1393, 02:43 صبح
کدهای زیر رو امتحان کنید (من تست نکردم)

private void frmSave_Load(object sender, EventArgs e)
{
int count = GetTotalCount();
int readCount = 0;

fill_dgv(count, ref readCount);
fill_combo(count, ref readCount);
fill_combo2(count, ref readCount);

ConfigDatagrid();
lblstatus.Text = " امروز " + md.GetNameDayInMonth() + " " + md.GetNumberDayInMonth().ToString() + " " + md.GetNameMonth() + " ماه " + md.GetNumberYear().ToString();
this.Activate();
}

private int GetTotalCount()
{
int a;
cmd = new SqlCommand("select count(*) from viewJavad", con);
con.Open();
a += Convert.ToInt32(cmd.ExecuteScalar());
cmd.CommandText = "select count(*) from tblstu";
a += Convert.ToInt32(cmd.ExecuteScalar());
cmd.CommandText = "select count(*) from tblstu";
a += Convert.ToInt32(cmd.ExecuteScalar());
return a;
}

private int fill_dgv(int count, ref int readCount)
{
dt = new DataTable();
dt.Columns.Add("name");
dt.Columns.Add("status");
// add another columns here
cmd.CommandText = "select * from viewJavad order by date desc , maintime desc";
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
string name = Convert.ToString(dr["name"]);
string status = Convert.ToString(dr["status"]);
// get another data of the record

dt.Rows.Add(name, status);

readCount++;
UpdateProgressBar(count, readCount);
}

dgv1.DataSource = dt;
dr.Dispose();
}

private void fill_combo(int count, ref int readCount)
{
dtcombo = new DataTable();
dtcombo.Columns.Add("name");
dtcombo.Columns.Add("code");
cmd.CommandText = "select * from tblstu";
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
string name = Convert.ToString(dr["name"]);
string code = Convert.ToString(dr["code"]);
dtcombo.Rows.Add(name, code);

readCount++;
UpdateProgressBar(count, readCount);
}
comboBox2.DataSource = dtcombo;
comboBox2.DisplayMember = "name";
comboBox2.ValueMember = "code";
}

private void fill_combo2(int count, ref int readCount)
{
dtcombo = new DataTable();
dtcombo.Columns.Add("name");
dtcombo.Columns.Add("code");
cmd.CommandText = "select * from tblstu";
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
string name = Convert.ToString(dr["name"]);
string code = Convert.ToString(dr["code"]);
dtcombo.Rows.Add(name, code);

readCount++;
UpdateProgressBar(count, readCount);
}
cmbname.DataSource = dtcombo;
cmbname.DisplayMember = "name";
cmbname.ValueMember = "code";
}

private void UpdateProgressBar(int count, int readCount)
{
int p = (readCount / count) * 100;
if (p != progressBar1.Value)
{
progressBar1.Value = p;
}
}

private void ConfigDatagrid()
{
dgv1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dgv1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
dgv1.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
dgv1.Columns[5].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
dgv1.Columns[4].AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
dgv1.Columns[7].AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
dgv1.Columns[0].HeaderText = "نام";
dgv1.Columns[1].HeaderText = "وضعیت";
dgv1.Columns[2].HeaderText = "وضعیت تأخیر";
dgv1.Columns[3].HeaderText = "مدت تأخیر";
dgv1.Columns[4].HeaderText = "جریمه تأخیر";
dgv1.Columns[5].HeaderText = "تاریخ";
dgv1.Columns[6].HeaderText = "زمان کلاس";
dgv1.Columns[7].HeaderText = "زمان ورود";
}

jd.mn98
جمعه 24 مرداد 1393, 21:54 عصر
تشکر از کدتون دوست عزیز
ولی فرم لودینگ من یک فرم جدایه و پروگرس بارم توی اونه نه توی این فرم دوم، برای اون باید چه کنم؟؟

Mahmoud.Afrad
جمعه 24 مرداد 1393, 22:17 عصر
یک پراپرتی(یا متد) در کلاس فرمی که پروگرسبار توش هست ایجاد کنید برای ست کردن value.

public partial class Frm_Loading : Form
{

public int Value
{
get { return this.progressBar1.Value; }
set { this.progressBar1.Value = value; }
}


حالا در فرم قبلی ابتدا نمونه بساز و ...

private void frmSave_Load(object sender, EventArgs e)
{
this.Hide();
int count = GetTotalCount();
int readCount = 0;
Frm_Loading frmLoading = new Frm_Loading();
frmLoading.Show();

fill_dgv(count, ref readCount, frmLoading);
fill_combo(count, ref readCount, frmLoading);
fill_combo2(count, ref readCount, frmLoading);

ConfigDatagrid();
lblstatus.Text = " امروز " + md.GetNameDayInMonth() + " " + md.GetNumberDayInMonth().ToString() + " " + md.GetNameMonth() + " ماه " + md.GetNumberYear().ToString();
this.Show();
frmLoading.Close();
}

private int GetTotalCount()
{
int a;
cmd = new SqlCommand("select count(*) from viewJavad", con);
con.Open();
a += Convert.ToInt32(cmd.ExecuteScalar());
cmd.CommandText = "select count(*) from tblstu";
a += Convert.ToInt32(cmd.ExecuteScalar());
cmd.CommandText = "select count(*) from tblstu";
a += Convert.ToInt32(cmd.ExecuteScalar());
return a;
}

private int fill_dgv(int count, ref int readCount, Frm_Loading frm)
{
dt = new DataTable();
dt.Columns.Add("name");
dt.Columns.Add("status");
// add another columns here
cmd.CommandText = "select * from viewJavad order by date desc , maintime desc";
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
string name = Convert.ToString(dr["name"]);
string status = Convert.ToString(dr["status"]);
// get another data of the record

dt.Rows.Add(name, status);

readCount++;
UpdateProgressBar(count, readCount, frm);
}

dgv1.DataSource = dt;
dr.Dispose();
}

private void fill_combo(int count, ref int readCount, Frm_Loading frm)
{
dtcombo = new DataTable();
dtcombo.Columns.Add("name");
dtcombo.Columns.Add("code");
cmd.CommandText = "select * from tblstu";
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
string name = Convert.ToString(dr["name"]);
string code = Convert.ToString(dr["code"]);
dtcombo.Rows.Add(name, code);

readCount++;
UpdateProgressBar(count, readCount, frm);
}
comboBox2.DataSource = dtcombo;
comboBox2.DisplayMember = "name";
comboBox2.ValueMember = "code";
}

private void fill_combo2(int count, ref int readCount, Frm_Loading frm)
{
dtcombo = new DataTable();
dtcombo.Columns.Add("name");
dtcombo.Columns.Add("code");
cmd.CommandText = "select * from tblstu";
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
string name = Convert.ToString(dr["name"]);
string code = Convert.ToString(dr["code"]);
dtcombo.Rows.Add(name, code);

readCount++;
UpdateProgressBar(count, readCount, frm);
}
cmbname.DataSource = dtcombo;
cmbname.DisplayMember = "name";
cmbname.ValueMember = "code";
}

private void UpdateProgressBar(int count, int readCount, Frm_Loading frm)
{
int p = (readCount / count) * 100;
if (p != frm.Value)
{
frm.Value = p;
}
}

private void ConfigDatagrid()
{
dgv1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dgv1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
dgv1.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
dgv1.Columns[5].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
dgv1.Columns[4].AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
dgv1.Columns[7].AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
dgv1.Columns[0].HeaderText = "نام";
dgv1.Columns[1].HeaderText = "وضعیت";
dgv1.Columns[2].HeaderText = "وضعیت تأخیر";
dgv1.Columns[3].HeaderText = "مدت تأخیر";
dgv1.Columns[4].HeaderText = "جریمه تأخیر";
dgv1.Columns[5].HeaderText = "تاریخ";
dgv1.Columns[6].HeaderText = "زمان کلاس";
dgv1.Columns[7].HeaderText = "زمان ورود";
}

jd.mn98
جمعه 24 مرداد 1393, 22:25 عصر
خیلی ممنون
منظورتون از فرم قبلی یعنی فرم دوم یا فرم لودینگ؟؟
منظور از نمونه سازی یعنی شی گیری ؟؟

Ali.hitter
جمعه 24 مرداد 1393, 23:12 عصر
سلام دوست عزیز میتونی خاصیت isinditerminate مربوط به progressbar رو true کنی و تمام کد هایی که اجراشون زمان میبره رو تو ی thread جدا بنویسی و آخر thread خاصیت isinditerminate رو false کنی و ...
اگه مشکل پیدا کردی بگو تا بیشتر تو کد ها راهنماییت کنم

jd.mn98
شنبه 25 مرداد 1393, 08:48 صبح
میشه بیشتر راهنمایی کنید؟؟ چون من با thread ها کار نکردم.

jd.mn98
شنبه 25 مرداد 1393, 15:15 عصر
دوستان از راهنمایی ها و کد هایی که قرار دادید ممنونم
تا الآن هر چی راهنمایی بود مربوط به لود شدن دیتابیس و اطلاعاتش بوده ، در برنامه من بیشتر وقت انتظار مربوط به لود شدن ابزار های روی فرم یا همون متد initializeComponent() هستش.
برای این مورد باید چیکار کنم که روند لود شدن ابزار ها رو توی پروگرس بار نشون بده.

Ali.hitter
شنبه 25 مرداد 1393, 16:47 عصر
شما در رویداد لود فرمت خاصیت isinditerminate پراگرس بار رو true کن؛تمام کد هایی ک اجراشون زمان بر هست رو (حتی intalizecomponent) توی یک thread بنویس و آخر thread حاصیت isinditerminate پراگرس بار رو false کن که میشه به این صورت :
private void Form2_Load(object sender,EventArgs e)
{
Thread t = new Thread(() => {
//code here
Application.Current.Dispatcher.Invoke((Action)(() =>
{
ProgressBar1.Isinditerminate = false;
ProgressBar1.IsVisible = false;
}));
});
ProgressBar1.Isinditerminate = true;
t.Start();
}

jd.mn98
شنبه 25 مرداد 1393, 18:09 عصر
پروگرس بار اصلا خاصیت Isinditerminate نداره!