2011-12-09 15 views
10

निष्पादित करते समय एक प्रगति पट्टी प्रदर्शित करना मैं उपयोगकर्ता को सूचित करना चाहता हूं कि डेटा को SQL डेटाबेस से पढ़ा जा रहा है और मैंने प्रोग्रेसबार के साथ एक फॉर्म बनाने का निर्णय लिया है लेकिन यह काम नहीं करता है - शायद क्योंकि थ्रेड की आवश्यकता है । मैं फॉर्मेटात्मक रूप से फॉर्म बनाना चाहता हूं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(); 

मेरे निर्दिष्ट लक्ष्यों को प्राप्त करने के लिए उपरोक्त कोड को मैं कैसे संशोधित करूं?

संपादित करें: बीटीडब्ल्यू, मैं अपनी परियोजना में प्रत्येक डेटा कार्यों में इस प्रगति पट्टी का उपयोग करना चाहता हूं। उदाहरण के लिए: fillGrid, runQuery ..

@ आपके उत्तर के लिए बहुत बहुत धन्यवाद। मैं मतलब है कि कैसे मैं उदाहरण के लिए वर्ग के एक समारोह का उपयोग कर सकते मेरी gridFill समारोह है कि कनेक्शन कक्षा में है: एक और रूप से

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; 
    }  
    } 

और उदाहरण प्रश्नों (वर्ग)

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); 
    } 

और मैं नहीं कर सकते कल्पना कैसे कर सकते हैं मैं इसे bw_DoWork घटना में उपयोग करता हूं। क्योंकि मेरे फ़ंक्शन में पैरामीटर हैं। (क्वेरी, ग्रिडव्यू) जब मैं इसे किसी अन्य वर्ग से कॉल करता हूं तो मैं इसे पैरामीटर के साथ उपयोग कर सकता हूं ...

पेज। : this Method मेरे लिए बहुत अच्छा है लेकिन यह काम नहीं किया। मुझे समस्या नहीं मिली

+7

पृष्ठभूमि कार्यकर्ता वर्ग में देखें। http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx –

उत्तर

3

अपने डेटाग्रिड को भरने के लिए पृष्ठभूमिवर्कर वर्ग का उपयोग करें।

 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(); // 
    } 

पृष्ठभूमिवर्कर को पैरामीटर भेजना संभव है। यदि आपको एक से अधिक पैरामीटर की आवश्यकता है, तो आप एक टुपल भेज सकते हैं जिसमें आपको आवश्यक वस्तुओं को शामिल किया गया हो।

संपादित करें: यदि आप 3.5 पर हैं, तो आप इसके बजाय एक KeyValuePair का उपयोग कर सकते हैं। उसके लिए कोड अपडेट किया गया है।

+0

आपकी टिप्पणी के लिए धन्यवाद, यह अच्छा काम करता है। लेकिन मुझे एक छोटी सी समस्या है। अपने डेटा को भरने समारोह एक कक्षा में है और 2 मानकों (क्वेरी और gridcontrol) लेता है और मैं इसे हर जगह का उपयोग अपने प्रोजेक्ट में सार्वजनिक शून्य fillGridControl (स्ट्रिंग sorgu, GridControl जीसी) { BindingSource डेटास्रोत = नए BindingSource (डीटी (sorgu) , शून्य); gc.DataSource = डेटा स्रोत; } क्या मैं इस फ़ंक्शन को bw_DoWork ईवेंट में डाल सकता हूं? – Rapunzo

+1

@Rapunzo आप bw_DoWork ईवेंट के अंदर से अपने fillGridControl फ़ंक्शन को बस कॉल कर सकते हैं। मुझे आपका कोड नहीं पता, लेकिन क्या कोई कारण है कि यह काम नहीं करेगा? – Will

+0

मैंने ऊपर अपना उत्तर अपडेट कर दिया है। – Will

0

जैसे Ash Burlaczenko अनुशंसित, आपको उस उद्देश्य के लिए BackgroundWorker का उपयोग करना होगा।

हालांकि, आप इसे प्रोग्रेसबार के साथ जोड़ना चाहते हैं, मैं कोडप्रोजेक्ट पर इस आलेख को देखने की अनुशंसा करता हूं: ProgressWorker

यह उपयोग करना काफी आसान है और यह आपके लिए प्रगति पट्टी को स्वचालित रूप से अपडेट करता है। आपको बस प्रगति पट्टी को अद्यतन करने के लिए समय-समय पर ProgressWorker.ReportProgress विधि को कॉल करना याद रखना होगा।