PDA

View Full Version : مبتدی: مشکل در کار با BackGround Worker



Sir-Programmer
جمعه 01 دی 1391, 11:41 صبح
سلام
دوستان یه برنامه ساختم با پر کردن یه تکست و زدن دکمه یه سری اطلاعات از وبسایت میگیرم اول بار وقتی تکست رو پر می کنم و بر روی Button کلیک میکنم BackGround Worker اجرا میشه و مشکلی نداره ولی بعدش میخوام مقدار (TextBox) تکس رو تغییر بدم و یه مقدار دیگه وارد کنم رو دکمه کلیک میکنم برنامه از کار میوفته و کار نمیکنه مشکل چیه ؟ از کد زیر استفاده کردم


public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//Inja Etelaato Az Sait Migiram
}

public void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Vaghti Compelet Shod Ye Serei Etelaato be TexBoxa Midam
}

private void button1_Click_1(object sender, EventArgs e)
{
bg.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerComplet ed);
bg.RunWorkerAsync();
}

Sir-Programmer
جمعه 01 دی 1391, 13:27 عصر
چرا کسی جواب نمیده

plus
جمعه 01 دی 1391, 15:13 عصر
شاید مشکل این باشه که وقتی کاربر 2 بار روی دکمه کلیک کنه 2 تا Handler به رویداد های BackgroundWorker نسبت داده میشه.میشه اینطوری درستش کرد:


public Form1()
{
InitializeComponent();
bg.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerComplet ed);
}
public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//Inja Etelaato Az Sait Migiram

}

public void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Vaghti Compelet Shod Ye Serei Etelaato be TexBoxa Midam
}

private void button1_Click_1(object sender, EventArgs e)
{
// Check if background worker is not busy
If (bg.IsBusy)
return;
bg.RunWorkerAsync();
}

veniz2008
جمعه 01 دی 1391, 15:15 عصر
سلام. بطور کلی بصورت زیر از background worker استفاده میشه :
در رویداد DoWork کد اصلی برنامه نوشته میشه.
در رویداد RunWorkerCompleted اول چک کنید که آیا خطایی رخ داده یانه. اگر خطایی رخ داده، پیغام مناسب رو صادر کنید و اگر خطایی رخ نداده، میتونید پیغام یا عمل مورد نیازتون رو انجام بدید (مثلا واسه مثال شما، مقداردهی تکست باکس ها).
درون دکمه هم باید bakgroundworker رو صدا بزنید.
به کدهای زیر دقت کنید. این کدها قراره اطلاعات جدول رو درون گرید نمایش بدن :

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
SqlConnection con = new SqlConnection("Data Source = .\\veniz2008;Initial Catalog = univ;Integrated security = True");
SqlDataAdapter da = new SqlDataAdapter("select * from student", con);
dt = new DataTable();
da.Fill(dt);
}


private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error == null)
dataGridView1.DataSource = dt;
else
MessageBox.Show("در نمایش داده ها مشکلی بوجود آمده، لطفا مجددا اقدام نمایید");
}


private void btnShow_Click(object sender, EventArgs e)
{
if (!backgroundWorker1.IsBusy)
backgroundWorker1.RunWorkerAsync();
}

Sir-Programmer
جمعه 01 دی 1391, 18:55 عصر
سلام دوباره !
از دوستانی که جواب دادن تشکر می کنم ولی متاسفانه مشکل حل نشد بازم 1 بار اجرا میشه مشکل کجاست !×