Почему AsyncCallback не обновляет мой gridview? - PullRequest
1 голос
/ 06 апреля 2010

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

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

    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);
    }

1 Ответ

0 голосов
/ 06 апреля 2010

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

И, как примечание, вы можете рассмотреть возможность только индексации в Rows и использования 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);
    }
...