I want to show progress bar during loading a Remote xml file. I am using Windows Application Form in Visual C# 2008 Express Edition.
private void button1_Click(object sender, EventArgs e)
{
string text = textBox1.Text;
string url = "http://api.bing.net/xml.aspx?AppId=XXX&Query=" + text + "&Sources=Translation&Version=2.2&Market=en-us&Translation.SourceLanguage=en&Translation.TargetLanguage=De";
XmlDocument xml = new XmlDocument();
xml.Load(url);
XmlNodeList node = xml.GetElementsByTagName("tra:TranslatedTerm");
for (int x = 0; x < node.Count; x++ )
{
textBox2.Text = node[x].InnerText;
progressbar1.Value = x;
}
}
Above code is not working for showing progressbar loading.. Please Suggest me some code. Thanks in advance
What exacly do you want to reflect by progress bar? Rather downloading the file (because it's big) or processing the file?
Your progress bar doesn't change because your method is synchronous - nothing else will happen unit it ends. BackgroundWorker
class is designed perfectly for this kind of problems. It does main work in an asynchronous manner and is able to report that progress has changed. Here is how to change tour method to use it:
private void button1_Click(object sender, EventArgs e)
{
string text = textBox1.Text;
string url = "http://api.bing.net/xml.aspx?AppId=XXX&Query=" + text + "&Sources=Translation&Version=2.2&Market=en-us&Translation.SourceLanguage=en&Translation.TargetLanguage=De";
XmlDocument xml = new XmlDocument();
xml.Load(url);
XmlNodeList node = xml.GetElementsByTagName("tra:TranslatedTerm");
BackgroundWorker worker = new BackgroundWorker();
// tell the background worker it can report progress
worker.WorkerReportsProgress = true;
// add our event handlers
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.RunWorkerCompleted);
worker.ProgressChanged += new ProgressChangedEventHandler(this.ProgressChanged);
worker.DoWork += new DoWorkEventHandler(this.DoWork);
// start the worker thread
worker.RunWorkerAsync(node);
}
Now, the main part:
private void DoWork(object sender, DoWorkEventArgs e)
{
// get a reference to the worker that started this request
BackgroundWorker workerSender = sender as BackgroundWorker;
// get a node list from agrument passed to RunWorkerAsync
XmlNodeList node = e.Argument as XmlNodeList;
for (int i = 0; x < node.Count; i++)
{
textBox2.Text = node[i].InnerText;
workerSender.ReportProgress(node.Count / i);
}
}
private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// do something after work is completed
}
public void ProgressChanged( object sender, ProgressChangedEventArgs e )
{
progressBar.Value = e.ProgressPercentage;
}
Try using HttpWebRequest
to get the file as a stream.
// Create a 'WebRequest' object with the specified url.
WebRequest myWebRequest = WebRequest.Create(url);
// Send the 'WebRequest' and wait for response.
WebResponse myWebResponse = myWebRequest.GetResponse();
// Obtain a 'Stream' object associated with the response object.
Stream myStream = myWebResponse.GetResponseStream();
long myStreamLenght = myWebResponse.ContentLength;
So now you know the length of this XML file. Then you have to asynchronously read the content from stream (BackgroundWorker
and StreamReader
is a good idea). Use myStream.Position
and myStreamLenght
to calculate the progress.
I know that I'm not very specific but I just wanted to put you in the right direction. I think it doesn't make sense to write about all those things here. Here you have links that will help you dealing with Stream
and BackgroundWorker
:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With