2011-06-22 10 views
0

SharePoint 2010に実装する必要がある一連のWebパーツがあります。データプロバイダWebパーツはUpdatePanelを使用し、非同期的にWebサービスコールを作成します。遅くなる。シンプルにするために、消費者をデータプロバイダとして使用する単一のコンシューマWebパーツをページ(チャート)に配置しました。Sharepoint 2010 Webパーツコミュニケーション - コンシューマがプロバイダを待つ方法

私の問題は、プロバイダを待つ消費者を得ることができないということです。さまざまなエラーが発生しますが、基本的にすべて「利用可能なデータはありません」に戻ります。これはChart Webパーツである可能性がありますが、同じデータを引き出す際に開発する他のカスタムパーツにも当てはまります。

質問は、プロバイダが準備ができているか、何らかの理由でプロバイダがデータを持って来るのを(ポーリングなどで)待つようにする方法です。

注:これは単なるプロトタイプであり、エラー処理などを追加していません。

コードは以下の通りです:

[ToolboxItem(true)] 
public partial class ClarityProjectGeneral : System.Web.UI.WebControls.WebParts.WebPart , IWebPartTable 
{ 

    public DataTable ProjectVitals = new DataTable(); For web part communication 

    // bunch of properties 

    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     InitializeControl(); 

     // For web part communication 
     // Initialize our datatable so the chart doesn't barf 
     DataColumn col = new DataColumn(); 
     col.DataType = typeof(string); 
     col.ColumnName = "Name"; 
     this.ProjectVitals.Columns.Add(col); 

     col = new DataColumn(); 
     col.DataType = typeof(DateTime); 
     col.ColumnName = "Start"; 
     this.ProjectVitals.Columns.Add(col); 

     col = new DataColumn(); 
     col.DataType = typeof(DateTime); 
     col.ColumnName = "End"; 
     this.ProjectVitals.Columns.Add(col); 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     loading.Visible = true; 
     content.Visible = false;    
    } 

    public ClarityObjectClasses.Projects GetProject(string projectID) 
    { 
     Clarity.ClarityAbstractorProject ca = new Clarity.ClarityAbstractorProject(this.Username, this.Password); 
     Dictionary<string, string> queryParams = new Dictionary<string, string>(); 
     queryParams.Add("projectID", projectID); 
     // Class for making web service call 
     ClarityObjectClasses.Projects response = new ClarityObjectClasses.Projects(); 
     response = ca.GetProject(queryParams); 
     return response; 
    } 

    protected void Timer1_Tick(object sender, EventArgs e) 
    { 
     if (this.ProjectID == null || this.Username == null || this.Password == null) 
     { 
      lblConfigError.Visible = true; 
      lblConfigError.Text = "One or more required configuration values are not set. Please check the web part configuration."; 
      panelProjectDetails.Visible = false; 
     } 
     else 
     { 
      loading.Visible = true; 
      content.Visible = false; 

      panelProjectDetails.Visible = true; 
      ClarityObjectClasses.Projects projects = GetProject(this.ProjectID); 
      //Assign a bunch of values 

      // For web part communication 
      LoadTable(projects.Project[0]); 

      Timer1.Enabled = false; 
      loading.Visible = false; 
      content.Visible = true; 
     } 
    } 


    /* Interface functions for Graph Chart communication */ 
    For web part communication 
    protected void LoadTable(ClarityObjectClasses.Project project) 
    { 
     DataRow row = ProjectVitals.NewRow(); 
     row["Name"] = project.name; 
     row["Start"] = project.start; 
     row["End"] = project.finish; 
     this.ProjectVitals.Rows.Add(row); 
    } 

    public PropertyDescriptorCollection Schema 
    { 
     get 
     { 
      return TypeDescriptor.GetProperties(ProjectVitals.DefaultView[0]); 
     } 
    } 

    public void GetTableData(TableCallback callback) 
    { 
     callback(ProjectVitals.Rows); 
    } 

    public bool ConnectionPointEnabled 
    { 
     get 
     { 
      object o = ViewState["ConnectionPointEnabled"]; 
      return (o != null) ? (bool)o : true; 
     } 
     set 
     { 
      ViewState["ConnectionPointEnabled"] = value; 
     } 
    } 

    [ConnectionProvider("Table", typeof(TableProviderConnectionPoint), AllowsMultipleConnections = true)] 
    public IWebPartTable GetConnectionInterface() 
    { 
     return this; 
    } 

    public class TableProviderConnectionPoint : ProviderConnectionPoint 
    { 
     public TableProviderConnectionPoint(MethodInfo callbackMethod, Type interfaceType, Type controlType, string name, string id, bool allowsMultipleConnections) 
      : base(callbackMethod, interfaceType, controlType, name, id, allowsMultipleConnections) 
     { 
     } 

     public override bool GetEnabled(Control control) 
     { 
      return ((ClarityProjectGeneral)control).ConnectionPointEnabled; 
     } 

    } 
} 
+0

こんにちは、どうやってあなたに行きましたか?私は同じことをするつもりで、可能かどうか疑問に思いますか? – Tim

答えて

0

はかなり理解していないが、それはあなたが非同期にデータをバインドするために、対応するイベントの不足のためのUpdatePanel、 内部の「接続」のWebパーツを使用することはできません 場合に役立ちます折り返し電話。

+0

基本的に、すべてUpdatePanelを使用して一連のWebパーツを作成することはできず、データをカスケード接続するときに非同期でロードすることはできますか? – McFaddon

+0

"Connectable WebParts"を使用する - いいえ.WebパーツがUpdatePanelの中​​に置かれることは保証されません。それがあなたのカスタムページであれば、すべてのWebパーツをUpdatePanel セクションに置くことで、 "Connectable"機能なしでそれを行うことができます。 –

0

私はちょうどこれを見つけました。私はまさに同じ問題を、自分自身の証明と同じようにカスタムwebpartを実装しようとしました。私は、Webパーツとリストの両方にフィルタを適用してから、チャートを消費させました。私が見つけたのは、私のウェブパーツが間違ったデータを送ったが、リストウェブパーツは期待通りに働いたということだった。

私はXsltListViewWebPart(またはその正確な名前は何でも)を反映し、IConnectionDataインターフェイスがあることを発見しました。これにより、依存関係を指定し、必要な正しい遅延バインディングを取得することができます。 GetRequiresDataは、データが要求される前にさらに多くの接続が消費されることを示します。

関連する問題