2010-04-06 5 views
1

지난 주에 대리인들과 작업하기 시작했으며 백그라운드에서 gridview async를 업데이트하려고합니다. 모든 잘, 아무런 오류 또는 그런가하지만 난 내 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에 전달한 개체를 Label에 핸들을 저장할 수있는 개체로 바꿔야합니다. 그런 다음 한 번 해보고 할당 한 다음 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

난 행과 상관 할 단서가 없다 [...], 어쩌면 나는 int와 ++를 추가해야한다. 그러나 그것이 나에게 묻는다면 평범한 추악한 것들이다. – Naruji

관련 문제