2010-04-06 2 views
1

Я начал работать с делегатами на прошлой неделе, и я пытаюсь обновить асинхронный gridview на фоне. Все идет хорошо, никаких ошибок или подобных, но я не получаю результат после моего EndInvoke. кто-нибудь знает, что я делаю неправильно?Почему AsyncCallback не обновляет мой gridview?

Вот фрагмент кода:

public delegate string WebServiceDelegate(DataKey key); 

    protected void btnCheckAll_Click(object sender, EventArgs e) 
    { 
     foreach (DataKey key in gvTest.DataKeys) 
     { 
      WebServiceDelegate wsDelegate = new WebServiceDelegate(GetWebserviceStatus); 
      wsDelegate.BeginInvoke(key, new AsyncCallback(UpdateWebserviceStatus), wsDelegate); 
     } 
    } 

    public string GetWebserviceStatus(DataKey key) 
    { 
     return String.Format("Updated {0}", key.Value); 
    } 

    public void UpdateWebserviceStatus(IAsyncResult result) 
    { 
     WebServiceDelegate wsDelegate = (WebServiceDelegate)result.AsyncState; 

     Label lblUpdate = (Label)gvTest.Rows[???].FindControl("lblUpdate"); 
     lblUpdate.Text = wsDelegate.EndInvoke(result); 
    } 

ответ

0

Я просто побежал тест с использованием тех же асинхронных вызовов в порядке их называют. Здесь все отлично. Я подозреваю, что у вас есть проблема с ручкой управления Label. Попробуйте разбить эту строку на пару строк, чтобы убедиться, что вы правильно ее используете. Строки действительно возвращают строку? Возвращает ли FindControl требуемый элемент управления? Вероятно, вы должны проверить это в обеих ваших функциях.

И как примечание стороны, вы можете рассмотреть только индексирование строк и использование FindControl один раз. Вам нужно будет заменить объект, который вы передаете в IAsyncResult, с тем, который может сохранить дескриптор метки. Затем вы можете сделать это один раз и назначить его, а затем использовать в UpdateWebserviceStatus.

Редактировать: Попробуйте этот код.

 public delegate void WebServiceDelegate(DataKey key); 

    protected void btnCheckAll_Click(object sender, EventArgs e) 
    { 
     foreach (DataKey key in gvTest.DataKeys) 
     { 
      WebServiceDelegate wsDelegate = new WebServiceDelegate(GetWebserviceStatus); 
      wsDelegate.BeginInvoke(key, new AsyncCallback(UpdateWebserviceStatus), wsDelegate); 
     } 
    } 

    public void GetWebserviceStatus(DataKey key) 
    { 
     DataRow row = gvTest.Rows[key.Value]; 
     System.Diagnostics.Trace.WriteLine("Row {0} null", row == null ? "is" : "isn't"); 

     Label lblUpdate = (Label)row.FindControl("lblUpdate"); 
     System.Diagnostics.Trace.WriteLine("Label {0} null", lblUpdate == null ? "is" : "isn't"); 

     lblUpdate.Text = string.Format("Updated {0}", key.Value); 
    } 

    public void UpdateWebserviceStatus(IAsyncResult result) 
    { 
    WebServiceDelegate wsDelegate = (WebServiceDelegate)result.AsyncState; 
    DataKey key = wsDelegate.EndInvoke(result); 
    } 
+0

Спасибо за ваш быстрый ответ. Я продолжил и сделал несколько вещей сам, и после прочтения вашего ответа стало ясно, что строки ничего не возвращают. Я попробую ваше предложение сейчас с обновлением объекта, чтобы сохранить метку метки. Редактировать: Я также обновил код выше до версии, имеющейся на данный момент. – Naruji

+0

Я просто не знаю, что делать с Rows [...], может быть, я должен добавлять int и ++ каждый раз, когда это натолкнется. Но это просто уродливо, если вы спросите меня. – Naruji