2012-07-02 4 views
4

Нет, это не такой основной вопрос. Я делаю приложение и получаю scenerio, как, файл будет загружен, затем он будет загружен на FTP-сервер, затем локальная копия будет удалена, затем одна запись будет помещена в словарь для этого имени файла. Таким образом, код нижеКак передать аргумент EventHandler

public void download_This_WebPage(string url, string cookies_String, string local_Saving_File_Name_With_Path) 
{ 
    WebClient wb = new WebClient(); 
    wb.Headers.Add(HttpRequestHeader.Cookie, cookies_String); 
    // Below I want to pass this local_File _Path to the event handler 
    wb.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(wb,); 
    wb.DownloadFileAsync(new Uri(url), local_Saving_File_Name_With_Path + ".html"); 
} 

public void data_Download_Completed(Object sender, System.ComponentModel.AsyncCompletedEventArgs args) 
{ 
     //use the file name to upload the file to FTP 

} 

public FTP_Completed 
{ 
    // Delete the file 
} 

Но я не знаю, как передать это имя файла в обработчик событий download_Completed. Может ли кто-нибудь направить меня в этом

EDIT: Благодарим вас за ответы от «Дарин» и «Фредерик». Есть ли вообще способ передать пользовательские данные в (уже определен) обработчик событий, как показано ниже

void main_Fn() 
{ 
    string my_Data = "Data"; 
    some_object a = new some_object(); 
    some_Object.click_event += new eventHandler(click_Happened); 
    (Assume that the event passes two ints, I also want to pass the string "my_Data" 
     to "click_Happened") 
    some_object.start(); 
} 

void click_Happened(int a, int b) 
{ 
    // I want to get the string "my_Data" here. 
} 

Короче, как обмануть подпись?

ответ

6

Вы можете передать имя файла в аргументе userToken до DownloadFileAsync(). После завершения операции, он будет доступен в UserState свойства AsyncCompletedEventArgs аргумента, переданного data_Download_Completed():

string filename = local_Saving_File_Name_With_Path + ".html"; 
wb.DownloadFileAsync(new Uri(url), filename, filename); 

Тогда:

public void data_Download_Completed(Object sender, 
    System.ComponentModel.AsyncCompletedEventArgs args) 
{ 
    string filename = (string) args.UserState; 
    // Now do something with 'filename'... 
} 
+0

Спасибо за решение. Но, все равно, чтобы вводить данные, определенные пользователем, в обработчик событий ?. – prabhakaran

+1

@prabhakaran, ну, вы можете передать любой тип в 'userToken', включая экземпляр любого' class' или 'struct', и он будет доступен в' UserState'. –

+0

Простите мою грамматическую ошибку. Я имел в виду, как это сделать для любого обработчика событий? – prabhakaran

1

Вы можете использовать 3-й аргумент метода DownloadFileAsync который позволяет передать UserState к заполненному обработчика:

// subscribe to the completed event 
wb.DownloadFileCompleted += data_Download_Completed; 
string file = local_Saving_File_Name_With_Path + ".html"; 
wb.DownloadFileAsync(new Uri("url"), file, file); 

и внутри обработчика:

public void data_Download_Completed(Object sender, AsyncCompletedEventArgs args) 
{ 
    // extract the filename from the UserState of the args 
    string file = args.UserState as string; 
    ... 

} 
+0

Я не знаю, кто сделал ответ первым. Спасибо вам за решение. Тот же вопрос к вам. Есть ли способ вставить пользовательские данные в обработчик событий. – prabhakaran

+0

Да, есть свойство UserState, как показано в моем ответе. Вы можете передать произвольный сложный объект вместо простой строки. –

+0

Простите мою ошибку грамматики. Я имел в виду, как это сделать для любого обработчика событий? – prabhakaran

Смежные вопросы