sử dụng thread .
Khi ấn nút search thì thread bắt đầu start
đến khi thread.Join() && trả về kết quả (=1 cái cờ bool nào đó)
tắt Loading
Hiện
Mình có tìm hiều một số class như BackgroundWorker, MultiThread.... nhưng vẫn chưa hiểu được cách áp dụng cho trường hợp sau đây của mình.
Bài toán của mình như sau : Mình có 2 form :
- 1 form chứa datagrid để show dữ liệu và 1 nút Search
- 1 form hiện câu thông báo : "Loading...."
Mình muốn hiện thông báo Loading... khi bấm nút Search(để thông báo đang load dữ liệu). Tuy nhiên mình chưa làm được.
Mình đã thử cách đơn giản là : gọi form thông báo trước form chứa dữ liệu nhưng không được( Vì khi bấm Search là cả form bị đứng -> do dữ liệu mình tìm khá lớn và lâu khoảng 5 phút ).
Vậy mình nên xài class nào cho vấn đề này.
sử dụng thread .
Khi ấn nút search thì thread bắt đầu start
đến khi thread.Join() && trả về kết quả (=1 cái cờ bool nào đó)
tắt Loading
Hiện
Quá yêu em khiến em xem
Đó như là sơ hở
Em điểu khiển và biến tôi thành 1 thằng khở
Mình viết như sau nhưng nó không hiện cái form loading .
Sao để vô tag CODE mà hem rõ vậy hen :(.Code:public partial class Frm_Precal : { Thread t1 = new Thread(new ThreadStart(MethodA)); public Frm_Precal() { InitializeComponent(); } static void MethodA() { Frm_Loading frm = new Frm_Loading(); // Form chứa label :" Loading...." frm.Show(); } private void buttonX1_Click(object sender, EventArgs e) { if (this.tabItem1.IsSelected == true) { t1.Start(); // Cái store phía dưới chạy khoảng 5 phút mới xong(do dữ liệu nhiều) // Khi chạy thì nó làm form bị treo khi nào xong thì hết treo SqlDataAdapter da = new SqlDataAdapter(); da = Assql.ExecuteDataAdapter("spFGActValuation_2011", CommandType.StoredProcedure, "@Start", this.dateTimeInput1.Value, "@End", this.dateTimeInput2.Value); DataSet ds = new DataSet(); da.Fill(ds); dataGridViewX1.DataSource = ds.Tables[0]; } }
Mình viết như sau nhưng nó không hiện cái form loading .
Tạo luồng là để load dữ liệu chứ ko pải để hiện form , bạn thử xem , mình chưa test đâuCode:public partial class Frm_Precal : { public Frm_Precal() { InitializeComponent(); } static void MethodA() { SqlDataAdapter da = new SqlDataAdapter(); da = Assql.ExecuteDataAdapter("spFGActValuation_2011", CommandType.StoredProcedure,@Start", this.dateTimeInput1.Value,"@End",this.dateTimeInput2.Value); DataSet ds = new DataSet(); da.Fill(ds); dataGridViewX1.DataSource = ds.Tables[0]; } private void buttonX1_Click(object sender, EventArgs e) { if (this.tabItem1.IsSelected == true) { Thread t1 = new Thread(new ThreadStart(MethodA)); t1.Start(); Frm_Loading frm = new Frm_Loading(); // Form chứa label :" Loading...." frm.Show(); t1.Join();//đợi đến khi luồng kết thúc thì Hide nó đi frm.Hide(); } }
Quá yêu em khiến em xem
Đó như là sơ hở
Em điểu khiển và biến tôi thành 1 thằng khở
Haha! theo mềnh thì cho 1 cái progressbar vô set value, 100% ---> run
Cám ơn bạn. Mình có thử lại nhưng khi mình để
OK nhưng phần khai báo thread bị lỗiCode:public void MethodA() { Frm_Process frm = new Frm_Process(); frm.Show(); SqlDataAdapter da = new SqlDataAdapter(); da = Assql.ExecuteDataAdapter("spFGActValuation_2011", CommandType.StoredProcedure, "@StartDate", this.dateTimeInput1.Value, "@EndDate", this.dateTimeInput2.Value); //da =Assql.ExecuteDataAdapter("SP_test", CommandType.StoredProcedure ); DataSet ds = new DataSet(); da.Fill(ds); dataGridViewX1.DataSource = ds.Tables[0]; }
"A field initializer cannot reference non-static field ....". Mình hiểu nó bản MethodA phải là static.Code:Thread t1 = new Thread(new ThreadStart(MethodA));
Nhưng nếu khai báo static cho Method thì cái DatagridX1( Mình dùng Dotnetbar) báo lỗi "An object reference is required for the non-static field....." ..
Dùng BackgroundWorker cho trường hợp của bạn là chuẩn rùi !!!
Ai đã gieo vào lòng Ai nỗi nhớ
Để vì Ai sóng vỗ những đêm dài
Ai có biết vì Ai-Ai không ngủ
Trằn trọc hoài nỗi nhớ của riêng Ai.
Bạn có thể xem ví dụ về BackgroundWorker. Nó có thể áp dụng cho trường hợp của bạn.
http://csharpviet.tk/thu-thuat-cshar...r-trong-c.html
Sống để code, chứ không code để sống!