Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在执行SQL查询时显示progressbar_C#_Sql_Multithreading_Progress Bar_Backgroundworker - Fatal编程技术网

C# 在执行SQL查询时显示progressbar

C# 在执行SQL查询时显示progressbar,c#,sql,multithreading,progress-bar,backgroundworker,C#,Sql,Multithreading,Progress Bar,Backgroundworker,我想在从SQL数据库读取数据时通知用户 我决定用progressbar创建一个表单,但它不起作用——可能是因为需要一个线程。我想以编程方式创建表单 ProgressBar pb = new ProgressBar(); pb.MarqueeAnimationSpeed = 30; pb.Style = ProgressBarStyle.Marquee; pb.Dock = DockStyle.Fill; prog

我想在从SQL数据库读取数据时通知用户 我决定用progressbar创建一个表单,但它不起作用——可能是因为需要一个线程。我想以编程方式创建表单

        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();
我如何修改上面的代码以实现我的既定目标

编辑:顺便说一句,我想在我的项目中的每个数据函数中使用这个progressbar表单。例如: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;
    }       
    }
以及来自其他表单(类)的示例查询

我无法想象我如何在bw_DoWork活动中使用它。因为我的函数有参数。(查询,gridview)当我从另一个类调用它时,我可以将它与参数一起使用


p、 对我来说这很好,但没用。我不理解这个问题

使用BackgroundWorker类填充数据网格

     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 (); //
    }
formprogressform;
公共无效函数(){
BackgroundWorker bw=新的BackgroundWorker();
bw.DoWork+=新DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted+=新的RunWorkerCompletedEventHandler(bw\u RunWorkerCompleted);
progressForm=新形式();
ProgressBar pb=新的ProgressBar();
pb.MarqueeAnimationSpeed=30;
pb.Style=ProgressBarStyle.Marquee;
pb.Dock=DockStyle.Fill;
progressForm.ClientSize=新大小(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….”;//在此处填写查询字符串
var params=新的KeyValuePair(sorgu,queryString);
bw.RunWorkerAsync(params);
}
void bw_DoWork(对象发送方,DoWorkEventArgs e){
KeyValuePair参数=e。参数为KeyValuePair;
ConnectionClass cc=新连接类();
cc.fillGrid(参数值、参数键);
}
void bw_RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e){
progressForm.Close()//
}
可以向BackgroundWorker发送参数。如果需要多个参数,可以发送包含所需对象的元组

编辑:如果您使用的是3.5,则可以改用KeyValuePair。代码已为此进行了更新。

正如建议的那样,您必须为此目的使用

但是,由于您希望将其与ProgressBar绑定,因此我建议您阅读关于CodeProject的这篇文章:


它相当容易使用,并自动为您更新进度栏。您需要做的就是记住不时调用
ProgressWorker.ReportProgress
方法,以更新相关的进度条。

查看后台工作类。谢谢你的评论,效果很好。但是我有一个小问题。我的数据填充函数在一个类中,接受2个参数(query和gridcontrol),我在我的项目public void fillGridControl(string sorgu,gridcontrol gc)的任何地方都使用它{BindingSource dataSource=new BindingSource(Dt(sorgu),null);gc.dataSource=dataSource;}我可以把这个函数放在bw_DoWork事件中吗?@Rapunzo您只需从bw_DoWork事件内部调用fillGridControl函数即可。我不知道你的代码,但是有什么理由这不起作用吗?我也用代码更新了我的问题,如果你再看一看更新的代码,我将非常感激。应该是您需要的。我认为这个元组类不包括在.NET3.5中。所以我还是做不到。。。
     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 (); //
    }