پر شدن progress bar هنگام باز شدن فرم جدید
سلام دوستان
من در برنامم وقتی از صفحه ی اصلی وارد یک فرم دیگه میشم ، لود شدن فرم جدید به دلیل بانک و کنترل های اون مقداری طول میکشه.
می خوام بدونم چطوری میشه که وقتی دکمه رو زدم که به فرم جدید برم در این بازه زمانی انتظار برای لود شدن فرم جدید ، یک progress bar پر بشه و وقتی کامل پر شد فرم به نمایش در بیاد.
من می دونم که باید با بک گراند ورکر این کارو کرد ولی نمیدونم چطوری این کارو انجام بدم ، اگه میشه رانمایی کنید.
با تشکر
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
من از این واسه بکاپ گیری استفاده کردم ...
بعد از دستورات مربوط به بانک این کد رو بنویس شاید جواب بده !
progressBar1.PerformStep();
MessageBox.Show("نسخه پشتیبان با موفقیت ایجاد شد","Take Backup",MessageBoxButtons.OK,MessageBoxIcon.Asteri sk);
progressBar1.Value = 100;
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
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();
}
}
}
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
دوستان بالاخره نفهمیدم باید چیکار کنم.موقعی که دکمه ی ورود به فرم دوم رو میزنم به دلیل بانک و اطلاعات اون ، مقداری طول میکشه تا فرم دوم باز بشه ، حالا میخوام این مدت زمانی که طول میشکه رو یک پروگرس بار پر بشه.باید چیکار کنم و از چه کد هایی استفاده کنم؟؟
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
دوست عزیز
سلام
اول توی فرمت یک پروگسس بار بزار بهمراه یک تایمر و کدهای زیر را در رویداد Tick بنویس
this.ProgressBar1.Value += 1;
if (this.ProgressBar1.Value == 50)
{
this.ProgressBar1.Value = 0;
timer2.Enabled = false;
نمایش فرم مورد نظر
امیدوارم که مشکلتو حل کرده باشه!!!
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
دوستان فک کنم منظورم رو متوجه نشدین
وقتی روی دکمه فرم دوم کلیک میکنم ، برنامه نزدیک به یک ثانیه طول میکشه تا فرم رو لود کنه و نمایش بده، من میخوام این بازه ی انتظار رو یک پروگرس بار بزارم که روند لود شدن اطلاعات رو نشون بده.
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
دوست خوبم من خودم قبل از شما درگیر همین قضیه بودم! توی همین فروم هم خیلی گشتم و یه سری از دوستان روشهایی رو پیشنهاد داده بودن که خیلی کاربردی نبودن و اکثرشون مشکل داشتن!
بالاخره خودم یه روشی رو پیدا کردم و پیاده سازی کردم که خیلی خوب کارمو راه انداخت.
برای فرم انتظار دوتا حالت وجود داره!
1. توی فرمی که میخوای باز بشه تعدادی رکورد لود میشه که زمان بره! اگه بخوای progressbar بر اساس تعداد رکوردات تنظیم بشه و روند لود شدن رو نشون بده کار کمی سخت میشه! حالا فرض کن بخوای رکوردهاتو از چند جدول واکشی کنی! داستان میشه!
2. حالت دوم اینه که شما یه سری عملیات میخوای انجام بدی و کاربر باید منتظر بمونه تا اون عملیات تموم بشه! حالا میخواد واکشی رکورد باشه یا یه کار محاسباتی یا اتصال به دستگاه! به هر حال چندثانیه طول میکشه!
پیاده سازی روش دوم نسبت به روش اول راحت تره و در عین حال کاربردش هم بیشتره.
توی روشی که من پیاده سازی کردم و توی پروژه های خودمم استفاده میکنم از یه ProgressBar چرخان استفاده کردم با کمی کد نویسی.
لینک دانلود
روش استفادش خیلی راحته! واسه همین دیگه توضیح نمیدم.
امیدوارم به دردتون بخوره
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
برنامتون بسیار خوب بود ، ولی اگه طوری باشه که با progressbar کار کنه بهتره.
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
کد فرم دوم که اطلاعات لود میشه رو بزارید.
میشه با دیتاریدر یه کارایی کرد. اگر linqtosql یا ef کار کنی هم راحت میتونی انجام بدی.
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
این مدت زمان لود شدن بیشتر برای برای کامپوننت و ابزار های روی فرمه.
حالا اگه کدشو میخواین
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();
}
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
کد متدهای fill رو هم بزار.
روند کلی به اینصورته که تعداد رکوردها رو بدست میاریم و بعد در حلقه توسط دیتاریدر داده ها رو دریافت میکنیم و در لیست یا دیتاتیبل قرار میدیم و در صورت پیشرفت ، پروگرسبار رو آپدیت میکنیم.
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
کد های 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";
}
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
کدهای زیر رو امتحان کنید (من تست نکردم)
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 = "زمان ورود";
}
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
تشکر از کدتون دوست عزیز
ولی فرم لودینگ من یک فرم جدایه و پروگرس بارم توی اونه نه توی این فرم دوم، برای اون باید چه کنم؟؟
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
یک پراپرتی(یا متد) در کلاس فرمی که پروگرسبار توش هست ایجاد کنید برای ست کردن 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 = "زمان ورود";
}
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
خیلی ممنون
منظورتون از فرم قبلی یعنی فرم دوم یا فرم لودینگ؟؟
منظور از نمونه سازی یعنی شی گیری ؟؟
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
سلام دوست عزیز میتونی خاصیت isinditerminate مربوط به progressbar رو true کنی و تمام کد هایی که اجراشون زمان میبره رو تو ی thread جدا بنویسی و آخر thread خاصیت isinditerminate رو false کنی و ...
اگه مشکل پیدا کردی بگو تا بیشتر تو کد ها راهنماییت کنم
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
میشه بیشتر راهنمایی کنید؟؟ چون من با thread ها کار نکردم.
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
دوستان از راهنمایی ها و کد هایی که قرار دادید ممنونم
تا الآن هر چی راهنمایی بود مربوط به لود شدن دیتابیس و اطلاعاتش بوده ، در برنامه من بیشتر وقت انتظار مربوط به لود شدن ابزار های روی فرم یا همون متد initializeComponent() هستش.
برای این مورد باید چیکار کنم که روند لود شدن ابزار ها رو توی پروگرس بار نشون بده.
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
شما در رویداد لود فرمت خاصیت 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();
}
نقل قول: پر شدن progress bar هنگام باز شدن فرم جدید
پروگرس بار اصلا خاصیت Isinditerminate نداره!