0

いくつかの作業を処理するバックグラウンドワーカーがいます。do_workイベントにループがあり、内部からcounterを使用してreportprogressを呼び出しています。カウンターは増加していますが、プログレスバーは移動していません。reportprogressを呼び出す1から100までの単純なforループを使用すると、プログレスバーが機能します。コードの量が多いことをお詫びします。

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 に答える