2011-11-15 13 views
1

Excel 2010テンプレートプロジェクトを作成しています。私のテンプレートでは、スタティックListObjectのコントロールを持つシートが多数あります。 ListObjectを初期化するには、BindingList<MyCustomType>をバインドして、私のMyCustomType公開プロパティごとに列を生成します。 ListObjectのいくつかの行が自動的に私のBindingListインスタンスを埋め尽くすので、それは本当に便利です。 Excelリボンにボタンを追加して、プログラムがEDMを通じてこれらの行を検証してコミットできるようにしました。これは私のデータをExcelシートのスタートアップイベントハンドラのListObjectにバインドする方法です。VSTO Excel:ファイルを開くときにListObjectデータソースを復元する

public partial class MyCustomTypesSheet 
{ 
    private BindingList<MyCustomType> myCustomTypes; 

    private void OnStartup(object sender, System.EventArgs e) 
    { 
     ExcelTools.ListObject myCustomTypeTable = this.MyCustomTypeData; 
     BindingList<MyCustomType> customTypes = new BindingList<MyCustomType>(); 

     myCustomTypeTable.SetDataBinding(customTypes); 
    } 

    // Implementation detail... 
} 

私の問題は、このテンプレートのユーザーが多くのセッションでこれらの行を入力する可能性が高いことです。つまり、データを入力し、ファイルを保存し、閉じ、再オープンし、いくつかの新しい行を入力し、最終的に彼が完了したと思うときにこれらの行をコミットしようとします。私が気づいたのは、テンプレートから作成されたExcelファイルを再度開くと、ListObjectコントロールのDataSourceプロパティがnullであることです。つまり、ListObjectのデータをBindingList<MyCustomType>に戻す方法がありません。私は検索していましたが、自動的にそれを行う方法が見つからず、すべての列をクロールしてMyCustomTypeのインスタンスを再作成するコードを作成したくはありません。理想的な世界で私はこのようにしたでしょう。

private void OnStartup(object sender, System.EventArgs e) 
{ 
    ExcelTools.ListObject myCustomTypeTable = this.MyCustomTypeData; 
    BindingList<MyCustomType> customTypes = null; 

    if (myCustomTypeTable.DataSource == null) // Will always be null and erase previous data. 
    { 
     customTypes = new BindingList<MyCustomType>(); 
     myCustomTypeTable.SetDataBinding(customTypes); 
    } 
    else 
    { 
     customTypes = myCustomTypeTable.DataSource as BindingList<MyCustomType>; 
    } 
} 

私はこの上の多くの研究を行ってきたが、私はあなたのいくつかは、私はこの問題を解決するのに役立つことを願って解決策を見つけることができませんでした。

ありがとうございました。

答えて

2

最後の解決策として、オブジェクトリストをXMLでシリアル化し、保存時にXMLカスタムパートとしてExcelファイルに追加することにしました。しかし、これを達成するためにMSDNのドキュメントを入手すると、データを保持する2つの方法があることがわかりました.XMLのカスタムパーツとデータキャッシングです。実際、データキャッシングは私が探していた機能とまったく同じでした。

私は単にCachedAttributeを使用して目標を達成することができました。

public partial class MyCustomTypesSheet 
{ 
    [Cached] 
    public BindingList<MyCustomType> MyCustomTypesDataSource { get; set; } 

    private void OnStartup(object sender, System.EventArgs e) 
    { 
     ExcelTools.ListObject myCustomTypeTable = this.MyCustomTypeData; 

     if (this.MyCustomTypesDataSource == null) 
     { 
      this.MyCustomTypesDataSource = new BindingList<MyCustomType>(); 
      this.MyCustomTypesDataSource.Add(new MyCustomType()); 
     } 

     myCustomTypeTable.SetDataBinding(this.MyCustomTypesDataSource); 
    } 

    private void InternalStartup() 
    { 
     this.Startup += new System.EventHandler(OnStartup); 
    } 
} 

これは魅力的です。データキャッシュの詳細については、MSDN documentationを参照してください。

関連する問題