Отслеживание добавляемых и удаляемых листов
Я работаю над надстройкой Excel и наткнулся на препятствие.
Я хочу обновить combobox с листами в книге Excel. В настоящее время я могу сделать это с помощью цикла foreach. Однако это ограничено в том смысле, что он только берет добавленные или вычитаемые листы, когда я запускаю его. Мой аддин выглядит безвкусно с кнопкой "Обновить листы", и я хотел бы избежать этого, если это возможно.
В идеале я мог бы привязать объект worksheet к combobox, чтобы он обновлялся на лету без моего вмешательства. Однако мои исследования показали, что это не подтверждает этого. Я не пробовал его, так как я не перед моим компьютером dev до тех пор, пока позже, но я почти уверен, что, поскольку он не наследует IList, он не будет работать в качестве источника данных.
Кто-нибудь делал что-нибудь подобное? Мне бы очень хотелось, чтобы эта штука работала правильно.
Спасибо!
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.