Jak podczepic progressbar pod webclient.downloadstring(pobieranie kody html do stringu)?
Nie da sie tego zrobic?
Nie, ale możesz użyć DownloadDataAsync
, DownloadFileAsync
albo OpenReadAsync
, które będą zgłaszały zdarzenie DownloadProgressChanged
.
No wlasnie probowalem i downloaddataasync jest typu void wiec za bardzo nie zwraca niczego
Tak ciężko było otworzyć dokumentację i przeczytać kilka zdań?
http://msdn.microsoft.com/en-us/library/ms144190.aspx
When the download completes, the DownloadDataCompleted event is raised. Your application must handle this event to receive notification. The downloaded data is available in the Result property.
Byte[] b = null;
WebClient webClient = new WebClient();
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
webClient.DownloadDataAsync(new Uri(url), b);
Encoding.UTF8.GetString(b);
W ostatniej linijce wysypuje mi sie program.
Jeśli metoda ma w nazwie "*Async", to zazwyczaj trzeba jej użyć w parze ze zdarzeniem "*Completed": http://msdn.microsoft.com/en-us/library/system.net.webclient.downloaddatacompleted.aspx
ale mi tu chodzi o co innego .... encoding mam problem bo nie zmienia mi na utf8 ani na ascii
MajQel napisał(a):
Byte[] b = null;
WebClient webClient = new WebClient();
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
webClient.DownloadDataAsync(new Uri(url), b);
Encoding.UTF8.GetString(b);
W ostatniej linijce wysypuje mi sie program.
I słusznie, bo próbujesz konwertować null
.
Odebrane dane przetwarzaj w metodzie zdarzenia DownloadDataCompleted
.
aaa nie zmienilem tutaj tego.... w programie juz mam zmienione i blad nie dotyczy wielkosci tablicy... sprobuje tak jak mowisz... chociaz nie mam jeszcze za bardzo pomyslu w jakis sposob to zrobic
Mam cos takiego:
Byte[] b = new Byte[60000];
WebClient webClient = new WebClient();
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
webClient.DownloadDataCompleted += new AsyncCompletedEventHandler(webClient_DownloadCompleted);
webClient.DownloadDataAsync(new Uri(url));
void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
double bytesIn = double.Parse(e.BytesReceived.ToString());
double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
double percentage = bytesIn / totalBytes * 100;
progressBar1.Value = int.Parse(Math.Truncate(percentage).ToString());
}
void webClient_DownloadCompleted(object sender, AsyncCompletedEventArgs e)
{
//nie wiem co tu dac zeby to tablice bajtow wstaiwalo do stringu i go zwracalo
}
void webClient_DownloadCompleted(object sender, AsyncCompletedEventArgs e) { } jak bym mial to zrobic zeby to zwracalo string ?
The downloaded data is available in the Result property.
Byte[] b = new Byte[60000];
WebClient webClient = new WebClient();
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
webClient.DownloadDataCompleted += new DownloadDataCompletedEventHandler(webClient_DownloadCompleted);
webClient.DownloadDataAsync(new Uri(url));
}
void webClient_DownloadCompleted(object sender, DownloadDataCompletedEventArgs e)
{
string w = Encoding.ASCII.GetString(e.Result);
}
Tak o ... weBclient uzywam w funkcji ktora chcialbym aby zwracala string ... downloadcompleted akurat musi chyba przyjmowac wartosc void wiec w tym momencie nie za bardzo sie orientuje jak to wszystko dokonczyc zeby sie kupy trzymalo
private void button1_Click(object sender, EventArgs e)
{
czysc();
string str = pobierz(textBox1.Text);
}
string pobierz(string a)
{
string url = "www.google.pl";
url += a;
Byte[] b = new Byte[60000];
WebClient webClient = new WebClient();
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
webClient.DownloadDataCompleted += new DownloadDataCompletedEventHandler(webClient_DownloadCompleted);
webClient.DownloadDataAsync(new Uri(url));
return //NO I WLASNIE W TYM MIEJSCU POWINNA FUNKCJA ZWRACAC KOD HTML POBRANY I PTRZETWORZONY(TZN NA STRING ZAMIENIONY) I NIE MAM POMYSLU JAK TEGO DOKONAC;
hm... z tego co widze to on nie pobiera mi kodu strony ....
Zwyczajnie nie wiem jak dac encoding z byte array do string (ma mi zwrocic kod xhtml)
Skoro chcesz mieć progressbar, to nie możesz tego zrobić synchronicznie, a robiąc asynchronicznie nie zrobisz return
tak, jak Ty chcesz. Dane odebrane masz dostępne w metodzie obsługującej zdarzenie DownloadDataCompleted
, tam możesz je np. przypisać do pola klasy i dalej na nich operować w innych metodach.
A skoro chcesz pobrać źródło strony, to dlaczego używasz metody DownloadDataAsync
zamiast DownloadStringAsync
(oraz oczywiście zdarzenia DownloadStringCompleted
)?
Dobrze by było, żeby ta metoda była wywołana w osobnym wątku, bo inaczej będzie ci blokować UI. Jeżeli korzystasz z nowego .NET to możesz pobawić się z async i await, trochę kodu zaoszczędzisz.
class Program
{
static string DownloadString(string address)
{
var webClient = new WebClient();
var reset = new ManualResetEvent(false);
webClient.DownloadProgressChanged += (sender, e) =>
Console.Write("Progress: {0,3}%\r", e.ProgressPercentage);
string data = null;
webClient.DownloadDataCompleted += (sender, e) =>
{
data = Encoding.ASCII.GetString(e.Result);
reset.Set();
};
webClient.DownloadDataAsync(new Uri(address));
reset.WaitOne();
return data;
}
static void Main(string[] args)
{
var thread = new Thread(() =>
{
Console.WriteLine("\nDownloaded {0} chars.", DownloadString(@"adres").Length);
});
thread.Start();
thread.Join();
}
}