1

私はExcel2010テンプレートプロジェクトに取り組んでいます。私のテンプレートにはListObject、それぞれに静的コントロールが含まれるシートがたくさんあります。を初期化ListObjectするために、をバインドして、パブリックプロパティBindingList<MyCustomType>ごとに列を生成します。ユーザーがのいくつかの行を使用すると、インスタンスが自動的にいっぱいになるMyCustomTypeため、非常に便利です。プログラムがEDMを介してこれらの行を検証およびコミットできるように、Excelリボンにボタンを追加しました。これは、Excelシートの1つの起動イベントハンドラーでデータをListObjectにバインドする方法です。ListObjectBindingList

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

私はこれについて多くの研究を行ってきましたが、解決策を見つけることができなかったので、あなたの何人かがこの問題を解決するのを手伝ってくれることを願っています。

ありがとう。

4

1 に答える 1

2

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

したがって、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 ドキュメントを参照してください。

于 2011-11-17T10:02:02.337 に答える