0

我有一个后台工作人员来处理一些工作,do_work 事件中有一个循环,并且我在内部使用计数器调用 reportprogress,计数器正在递增但进度条没有移动。如果我使用从 1 到 100 的简单 for 循环调用 reportprogress,则进度条可以工作。对不起代码量..

namespace ConvertOSGB_WGS84
{
public partial class InterfaceConvertLonLat : Form
{
    public static Int32 OGB_M = 150;
    [DllImport("TTDatum3.Dll", EntryPoint = "WGS84ToLocal", CallingConvention =  CallingConvention.StdCall, SetLastError = true)]
    public static extern Int32 WGS84ToLocal([In, Out]ref double lat, [In, Out] ref double lon, Int32 datum);

    [DllImport("TTDatum3.Dll", EntryPoint = "LocalToWGS84", CallingConvention = CallingConvention.StdCall, SetLastError = true)]
    public static extern Int32 LocalToWGS84([In, Out]ref double lat, [In, Out] ref double lon, Int32 datum);

    [DllImport("TTDatum3.Dll", EntryPoint = "OSGB36ToOSGBGrid", CallingConvention = CallingConvention.StdCall, SetLastError = true)]
    public static extern Int32 OSGB36ToOSGBGrid(double lat, double lon, [In, Out] ref double east, [In, Out] ref double north);

    [DllImport("TTDatum3.Dll", EntryPoint = "OSGBGridToOSGB36", CallingConvention = CallingConvention.StdCall, SetLastError = true)]
    public static extern Int32 OSGBGridToOSGB36(double east, double north, [In, Out] ref double lat, [In, Out]  ref double lon);
    CovertLonLat convert = new CovertLonLat();


    public InterfaceConvertLonLat()
    {
        InitializeComponent();
        Shown += new EventHandler(Form1_Shown);
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);

    }
    public void ConvertLonLat_Load(object sender, EventArgs e)
    {

    }

    public void Form1_Shown(object sender, EventArgs e)
    {     
        backgroundWorker1.RunWorkerAsync();
    }

    public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        MessageBox.Show("backgroundworker");
        SqlConnection conn = new SqlConnection(Connections.dbConnection1());
        InterfaceConvertLonLat con = new InterfaceConvertLonLat();
        SqlCommand cmd = new SqlCommand();
        SqlCommand cmd1 = new SqlCommand();
        SqlDataAdapter adapter = new SqlDataAdapter();
        DataSet address = new DataSet();
        int counter = 0;


        cmd.Parameters.Clear();

        if (conn.State.Equals(System.Data.ConnectionState.Closed))
        {
            conn.Open();
        }
        try
        {
            adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
            cmd1.Parameters.Add(new SqlParameter("@LTW", SqlDbType.Float));
            cmd1.Parameters.Add(new SqlParameter("@LGW", SqlDbType.Float));


            string dbQuery = "select * from paf ";

            cmd.CommandText = (dbQuery);
            cmd.CommandType = CommandType.Text;
            cmd.Connection = conn;
            adapter.SelectCommand = cmd;
            adapter.Fill(address, "OBG36ToWGS84");

            foreach (DataRow LonLat in address.Tables[0].Rows)
            {
                counter++;
                MessageBox.Show("value " + counter);
                con.backgroundWorker1.ReportProgress(counter);
                Double lon = 0;
                Double lat = 0;

                lat = Convert.ToDouble(LonLat["LTO"]);
                lon = Convert.ToDouble(LonLat["LGO"]);
                LocalToWGS84(ref lat, ref lon, OGB_M);

                cmd1.Parameters["@LTW"].Value = lat;
                cmd1.Parameters["@LGW"].Value = lon;

                string dbQuery1 = "update paf set LTW = @LTW, LGW = @LGW";

                cmd1.CommandText = (dbQuery1);
                cmd1.CommandType = CommandType.Text;
                cmd1.Connection = conn;
                cmd1.ExecuteNonQuery();

            }
        }
        catch (Exception ex)
        {

            MessageBox.Show("error converting: " + ex.Message);
        }
        finally
        {

            conn.Close();

        }
    }

    public void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {

         progressBar1.Value = e.ProgressPercentage;
    }




}

}

4

1 回答 1

2

这就是问题:

InterfaceConvertLonLat con = new InterfaceConvertLonLat();
...
con.backgroundWorker1.ReportProgress(counter);

因此,您正在报告另一个后台工作人员的进度 - 一个与未显示的表单相关联的工作人员。只需使用:

backgroundWorker1.ReportProgress(counter);
于 2012-10-02T14:22:19.507 回答