Отслеживание добавляемых и удаляемых листов


Я работаю над надстройкой Excel и наткнулся на препятствие.

Я хочу обновить combobox с листами в книге Excel. В настоящее время я могу сделать это с помощью цикла foreach. Однако это ограничено в том смысле, что он только берет добавленные или вычитаемые листы, когда я запускаю его. Мой аддин выглядит безвкусно с кнопкой "Обновить листы", и я хотел бы избежать этого, если это возможно.

В идеале я мог бы привязать объект worksheet к combobox, чтобы он обновлялся на лету без моего вмешательства. Однако мои исследования показали, что это не подтверждает этого. Я не пробовал его, так как я не перед моим компьютером dev до тех пор, пока позже, но я почти уверен, что, поскольку он не наследует IList, он не будет работать в качестве источника данных.

Кто-нибудь делал что-нибудь подобное? Мне бы очень хотелось, чтобы эта штука работала правильно.

Спасибо!

2 4

2 ответа:

Excel.Объект приложения имеет событие WorkbookNewSheet, которое срабатывает при добавлении нового листа. К сожалению, похоже, что у него нет события, которое срабатывает при удалении листа.

Вы можете поместить код обновления combobox в событие combobox DropDown. Он срабатывает, когда открывается окно combobox, и ваш код может обновить элементы combobox до того, как список будет виден.

Мне нравится идея Уорренга о выпадающем событии. Если это работает, то кажется идеальным. В противном случае я бы рекомендовал использовать событие sheet_activate рабочей книги. Это срабатывает, когда листы создаются или удаляются, по крайней мере, если это сделано пользователем.

В C# необходимо создать экземпляр события и создать обработчик. Фактически это можно сделать в событии Form_Load, так что при создании экземпляра формы создается обработчик событий. Вам нужно установить ссылки на Interop.Превосходите так свою форму.код cs был бы выглядит примерно так:

Итак, ваше событие Form_Load выглядит примерно так:

using Excel = Microsoft.Office.Interop.Excel;

namespace ExcelWorkbook1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Globals.ThisWorkbook.SheetActivate +=
                new Excel.WorkbookEvents_SheetActivateEventHandler(
                ThisWorkbook_SheetActivate);
        }

        private void ThisWorkbook_SheetActivate(object Sh)
        {
            //Fill your combobox here
        }
    }
}

EDIT: я нашел базовый код на этом сайте MSDN.