2011-12-09 9 views
10

Tôi muốn thông báo cho người dùng khi dữ liệu đang được đọc từ cơ sở dữ liệu SQL và tôi quyết định tạo biểu mẫu bằng thanh tiến trình nhưng nó không hoạt động - có thể do một chuỗi là cần thiết . Tôi muốn tạo biểu mẫu theo chương trìnhHiển thị thanh tiến trình trong khi thực thi Truy vấn SQL

 ProgressBar pb = new ProgressBar(); 

     pb.MarqueeAnimationSpeed = 30; 
     pb.Style = ProgressBarStyle.Marquee; 
     pb.Dock = DockStyle.Fill; 

     progressForm.ClientSize = new Size(200, 50); 
     progressForm.FormBorderStyle = FormBorderStyle.FixedDialog; 
     progressForm.StartPosition = FormStartPosition.CenterScreen; 
     progressForm.Controls.Add(pb); 
     progressForm.ControlBox = false; 
     progressForm.TopMost = true; 

     progressForm.Show(); 
     //do data processes here (all queries and executes) 
     progressForm.close(); 

Làm cách nào để sửa đổi mã ở trên để đạt được mục tiêu đã nêu?

chỉnh sửa: Btw, tôi muốn sử dụng biểu mẫu thanh tiến trình này trong mọi chức năng dữ liệu trong dự án của mình. Ví dụ: fillGrid, runQuery ..

@ Sẽ cảm ơn bạn rất nhiều vì câu trả lời của bạn. Tôi có nghĩa là làm thế nào tôi có thể sử dụng một chức năng của lớp ví dụ chức năng gridFill của tôi là ở chỗ lớp kết nối:

class ConnectionClass 
    { 
     public static SqlConnection connection = new SqlConnection(); 

    public string sorgu; 
    public static string server; 
    public static string userId; 
    public static string catalog; 
    public static string password; 
    public static string accessMethod; 
    public DataSet ds = new DataSet(); 
    Form progressForm = new Form();  

    public bool Open() 
    { 
     try 
     { 
      if (connection.State != ConnectionState.Open) 
      { 

       connection.ConnectionString = "Data Source = " + server + ";" + 
               "Initial Catalog=" + catalog + ";" + 
               "User ID=" + userId + ";" + 
               "Password=" + password + ";" + 
               "Connect Timeout=0"; 

       connection.Open(); 
       return true; 
      } 
      else 
      { 
       return true; 
      } 


     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("System message:" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      return false; 
     } 

    } 

    public DataTable Dt(string query) 
    { 
     DataTable dt = new DataTable(); 
     if (Open()) 
     { 
      SqlDataAdapter da = new SqlDataAdapter(query, connection); 
      try 
      { 
       //progressForm.Showdialog() is this possible??? 
       da.Fill(dt); 
       //progressForm.close(); ?? 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Sistem Mesajı:" + ex.Message, "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     }   
     return dt; 
    } 

    public bool Run(string query, string hataMsj) 
    { 
     Form activeForm = Form.ActiveForm; 
     query = " SET DATEFORMAT DMY " + query; 

     SqlCommand sc = new SqlCommand(query, connection); 
     try 
     { 
      Open(); 
      sc.ExecuteNonQuery(); 
      return true; 
     }   
     catch (Exception) 
     { 
      return false; 
     } 
    } 

    public void fillComboBox(string sorgu, ComboBox cb, string text, string value) 
    { 
     DataTable dt = Dt(sorgu); 

     cb.DisplayMember = text; 
     cb.ValueMember = value; 
     cb.DataSource = dt; 
     if (cb.Items.Count > 0) 
     { 
      cb.SelectedIndex = 0; 
     } 

    } 

    public int fillGridView(string sorgu, DataGridView dgv) 
    { 
     DataTable dtGrvw = Dt(sorgu); 
     dgv.DataSource = dtGrvw; 
     return 1; 
    }  
    } 

và ví dụ truy vấn từ một hình thức khác (class)

ConnectionClass cc = new ConnectionClass(); 

    query= " INSERT INTO tblPersonel (" + 
              " [sqlUserName] " + 
              ",[personelNo] " + 
              ",[ad] " + 
              ",[soyad] " + 
              ",[departmanId] " + 
              ",[emailadres] " + 
              ",[tcKimlikNo],[kangurubu],[dokumaciNo])VALUES" + 
              "('" + tbSqlUserName.Text + 
              "','" + tbPersonelNo.Text + 
              "','" + tbAd.Text + 
              "','" + tbSoyad.Text + 
              "','" + cbDepartman.SelectedValue.ToString() + 
              "','" + tbMail.Text + 
              "','" + tbKimlikno.Text + 
              "','" + tbKangrubu.Text + 
              "','" + tbDokumaciNo.Text + "') "; 
        if (cc.Run(query, "Unexpected error on insert new person")) 
        { 
         fillGrid(); 
         this.Close(); 

        } 

    public void fillGrid() 
    { 
     query= " select * from View_Personel order by personelNo desc"; 
     cc.fillGridView(query, gridviewPersonel); 
    } 

và tôi không thể tưởng tượng như thế nào có thể Tôi sử dụng nó trong sự kiện bw_DoWork. bởi vì chức năng của tôi có các tham số (truy vấn, GridView) khi tôi gọi nó từ một lớp khác, tôi có thể sử dụng nó với các tham số ...

p.s. : this Method là khá tốt đối với tôi nhưng nó không hoạt động. Tôi không hiểu vấn đề

+7

Nhìn vào lớp nhân viên nền. http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx –

Trả lời

3

Sử dụng lớp BackgroundWorker để lấp đầy DataGrid của bạn.

 Form progressForm; 

    public void func() { 
     BackgroundWorker bw = new BackgroundWorker(); 
     bw.DoWork += new DoWorkEventHandler (bw_DoWork); 
     bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler (bw_RunWorkerCompleted); 

     progressForm = new Form(); 

     ProgressBar pb = new ProgressBar(); 

     pb.MarqueeAnimationSpeed = 30; 
     pb.Style = ProgressBarStyle.Marquee; 
     pb.Dock = DockStyle.Fill; 

     progressForm.ClientSize = new Size (200, 50); 
     progressForm.FormBorderStyle = FormBorderStyle.FixedDialog; 
     progressForm.StartPosition = FormStartPosition.CenterScreen; 
     progressForm.Controls.Add (pb); 
     progressForm.ControlBox = false; 
     progressForm.TopMost = true; 

     progressForm.Show(); 

     string queryString = "SELECT ...."; // fill query string here 
     var params = new KeyValuePair<GridControl, string>(sorgu, queryString); 
     bw.RunWorkerAsync (params); 
    } 

    void bw_DoWork (object sender, DoWorkEventArgs e) { 
     KeyValuePair<GridControl, string> params = e.Argument as KeyValuePair<GridControl, string>; 
     ConnectionClass cc = new Connection Class(); 
     cc.fillGrid(params.Value, params.Key); 
    } 

    void bw_RunWorkerCompleted (object sender, RunWorkerCompletedEventArgs e) { 
     progressForm.Close(); // 
    } 

Có thể gửi tham số cho BackgroundWorker. Nếu bạn cần nhiều tham số, bạn có thể gửi Tuple chứa bất kỳ đối tượng nào bạn cần.

EDIT: Nếu bạn đang sử dụng 3,5, bạn có thể sử dụng KeyValuePair thay thế. Mã được cập nhật cho điều đó.

+0

cảm ơn bạn đã bình luận của bạn nó hoạt động tốt. nhưng tôi có một chút vấn đề. chức năng điền dữ liệu của tôi là trong một lớp và có 2 tham số (truy vấn và gridcontrol) và tôi sử dụng nó ở mọi nơi trong dự án của tôi void công khai fillGridControl (chuỗi sorgu, GridControl gc) { BindingSource dataSource = new BindingSource (Dt (sorgu) , vô giá trị); gc.DataSource = dataSource; } tôi có thể đặt chức năng này trong sự kiện bw_DoWork không? – Rapunzo

+1

@Rapunzo Bạn có thể chỉ cần gọi hàm fillGridControl của bạn từ bên trong sự kiện bw_DoWork. Tôi không biết mã của bạn, nhưng có bất kỳ lý do gì mà điều này sẽ không hoạt động? – Will

+0

Tôi đã cập nhật câu trả lời của mình ở trên. – Will

0

Giống như Ash Burlaczenko được đề xuất, bạn sẽ phải sử dụng BackgroundWorker cho mục đích đó.

Vì, tuy nhiên, bạn muốn kết hợp nó với ProgressBar, tôi khuyên bạn nên xem bài viết này trên CodeProject: ProgressWorker.

Nó khá dễ sử dụng và nó tự động cập nhật thanh tiến trình cho bạn. Tất cả những gì bạn phải làm là hãy nhớ gọi phương thức ProgressWorker.ReportProgress theo thời gian để cập nhật thanh tiến trình được liên kết.