VSTO Excel: восстановить источник данных ListObject при повторном открытии файла - PullRequest
1 голос
/ 15 ноября 2011

Я работаю над проектом шаблона Excel 2010.В моем шаблоне у меня есть много листов со статическими ListObject элементами управления в каждом из них.Чтобы инициализировать мой ListObject, я связываю BindingList<MyCustomType>, чтобы он генерировал столбец для каждого из моих MyCustomType открытых свойств.Это действительно удобно, потому что когда пользователь вводит строки в ListObject, он автоматически заполняет мой экземпляр BindingList.Я добавил кнопку на ленте Excel, чтобы программа могла проверять и фиксировать эти строки с помощью EDM.Вот как я связываю свои данные с объектом ListObject в обработчике событий запуска одного из моих листов Excel.

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, созданного из шаблона, свойство DataSource моих элементов управления ListObject имеет значение 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>;
    }
}

Я провел много исследований по этому вопросу, но не смог найти решение, поэтому надеюсь, что некоторые из вас помогут мне решитьэтот выпуск.

Спасибо.

1 Ответ

2 голосов
/ 17 ноября 2011

В качестве последнего решения я решил, что я сериализую свой список объектов в XML, а затем добавлю его в качестве настраиваемой части XML в файл Excel при сохранении.Но когда я попал в документацию MSDN, чтобы достичь этого, я обнаружил, что существует два способа сохранения данных: пользовательская часть 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 .

...