Container.RetrieveItems() は時間がかかるサービスを呼び出すので、非同期で呼び出したいと思います (アイテムが取得された後、Container クラスの List プロパティに設定されます)。アイテムの取得が完了したら、updatePanel 内にある gridView を更新したいと思います (updatePanel Mode="Conditional" および ScriptManager EnablePartialRendering="true"。UpdatePanel にはトリガー アイテムがありません)。
ブレークポイントを設定し、各ステップを実行しました。アイテムが取得され、グリッドがデータバインドされてから update が呼び出されます。例外はスローされていませんが、グリッドはコンテンツで更新されていません。トリガーと Timer.OnTick イベントを使用して UpdatePanel を更新するように設定すると、完全に機能しますが、アイテムが取得された後にのみ更新する必要があるため、サービス呼び出しの完了時に手動で UpdatePanel.Update() を起動するのが理想的です。
私はかなりの検索を行いましたが、すべての答えは「DataBind() を呼び出すのを忘れました」です。
不足しているものはありますか?
private void UpdateGrid()
{
grid.DataSource = Container.List;
grid.DataBind();
updatePanel.Update();
}
protected void Page_Load(object sender, EventArgs e)
{
var task = Task.Factory.StartNew(Container.RetrieveItems);
task.ContinueWith((x) => UpdateGrid());
}
更新: 問題を特定するために、より簡単なテストをセットアップしました。メソッドの完了時に Text プロパティが更新されるラベルを作成しました。ページが読み込まれるとメソッドが呼び出され、メソッドが終了すると updatePanel.Update() が呼び出されましたが、変更はありませんでした。
Jaimes のアドバイスに従って、Button_click のポストバック内で手動更新を呼び出してみたところ、実際にラベルが更新されました。そのため、非同期タスクの完了時にコンテンツを更新する最良の方法をまだ探していますが、現在のセットアップが機能していません。