C# WinApp สอบถามเรื่อง การใช้ System.Threading.Thread กับ textBox ที่ Bind กับ BindingSource ครับ
ใช้ BackgroundWorker แทนครับ ไม่ต้องมานั่งเขีย Event เองครับ
Date :
2016-05-28 12:14:01
By :
mr.win
Code (C#)
private void button2_Click(object sender, EventArgs e)
{
// new System.Threading.Thread(Display).Start();
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
zipCodeTTableAdapter.FillBy(this.database2DataSet.ZipCodeT, textBox1.Text);
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show(zipCodeTBindingSource.Count.ToString());
if (e.Error != null) throw e.Error;
}
ทำงานเสร็จแล้ว zipCodeTextBox กับ BindingNavigator ก็ไม่เปลี่ยนเหมือนเดิมครับ ทั้งๆที่ Display(); แค่นั้นทุกอย่างก็เปลี่ยนหมด
ประเด็นของปัญหานี้คือ ผมอยากจะ insert ข้อมูลจาก excel พอดีมันใช้เวลานาน แล้วทำให้ค้างที่หน้าโปรแกรม
ผมจึงลอง เอาพวก thread มาจับดูครับ
Date :
2016-05-28 15:04:09
By :
lamaka.tor
ในที่สุดก็ได้ครับ
เพิ่ม zipCodeTBindingSource.ResetBindings(false);
Code (C#)
private void button2_Click(object sender, EventArgs e)
{
//new System.Threading.Thread(Display).Start();
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
zipCodeTTableAdapter.FillBy(this.database2DataSet.ZipCodeT, textBox1.Text);
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
zipCodeTBindingSource.ResetBindings(false);
if (e.Error != null) throw e.Error;
}
ไปอ่านเจอโค๊ดแปลกๆ ได้ใจมากครับ
Code (C#)
button.Click += (_, __) =>
{
// Create another thread that does something with the data object
var worker = new BackgroundWorker();
worker.DoWork += (___, _____) =>
{
for (int i = 0; i < 10; i++)
{
// This doesn't lead to any cross-thread exception
// anymore, cause the binding source was told to
// be quiet. When we're finished and back in the
// gui thread tell her to fire again its events.
myData.MyText = "Try " + i;
}
};
worker.RunWorkerCompleted += (___, ____) =>
{
// Back in gui thread let the binding source
// update the gui elements.
bindingSource.ResumeBinding();
button.Enabled = true;
};
// Stop the binding source from propagating
// any events to the gui thread.
bindingSource.SuspendBinding();
button.Enabled = false;
worker.RunWorkerAsync();
};
Date :
2016-05-28 15:41:52
By :
lamaka.tor
ถ้าใช้ backgroupworker การทำงานมันจะแบ่งเป็น 2 ส่วนหลักๆ อ่ะครับ
คือ
ส่วนทำงาน Event DoWork
อันนี้ที่ใส่ใน code ก็คือถูกแล้ว อยากให้มันทำอะไรก็สั่งให้ทำตรงนี้
ส่วนแสดงผล Event ProgressChanged
อันนี้จะใช้สำหรับแสดงผล อย่างเดียวถ้าเอา code ส่วนทำงานมาใส่จะ error หรือทำงานไม่ถูกต้อง ระวังด้วยนะครับ
ที่จะเอามาใส่ ก็เช่น คิดจากจำนวน record ที่จะทำงานด้วย แล้วเอาคิดเป็น % แสดงผลใน slider
หรือในกรณีนี้คือให้ค่าใน zipcodetextbox เปลี่ยนแปลง เพิ่มตัวแปรมาตัวนึงครับ
ส่งค่าอัพเดทกันระหว่าง event DoWork กับ event ProgressChanged
ลองดูครับ ถ้าใช้เป็นแล้วสนุกนะ backgroupworker ประยุกต์ใช้ได้เพียบเลย
Date :
2016-05-28 15:49:27
By :
salapao_codeman
Load balance : Server 02