我有一个后台工作来处理一些工作,在do_work事件中有一个循环,并且从我调用带有计数器的reportprogress,计数器正在递增但是进度条没有移动。如果我使用一个简单的for循环从1到100调用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;
}
}
}
答案 0 :(得分:2)
这是问题所在:
InterfaceConvertLonLat con = new InterfaceConvertLonLat();
...
con.backgroundWorker1.ReportProgress(counter);
因此,您要报告不同后台工作程序的进度 - 一个与未显示的表单相关联的后台工作程序。只需使用:
backgroundWorker1.ReportProgress(counter);