2010-02-23 4 views
0

Я создаю ListObject в Excel с помощью VSTO следующим образом:Как я могу вернуть ранее созданный Excel ListObject?

ListObject lo = ws_vsto.Controls.AddListObject(range, "MyList"); 

(переменная диапазон ранее определенный диапазон.)

Если я затем цикл по таблице Controls коллекции я могу найти, что ListObject ,

Однако, если я сохраню книгу и снова ее открою, коллекция элементов управления пуста. Как я могу вернуть этот ListObject после повторного открытия, чтобы продолжить работу с ним?

EDIT

У меня есть немного дальше:

 var wb = Globals.ThisAddIn.Application.ActiveWorkbook; 
     var wb_vsto = wb.GetVstoObject(); 


     foreach (Excel.Worksheet ws in wb.Worksheets) 
     { 
      var wsv = ws.GetVstoObject(); 
      foreach (Excel.ListObject l in ws.ListObjects) 
      { 
       MessageBox.Show(l.Name); 
       var lo = wsv.Controls.AddListObject(l); 
       Excel.Range range = lo.Range; 
       range.Activate(); 
      } 
     } 

Когда я добираюсь до вар Lo = линии, у меня есть ListObject добавлен в коллекцию Controls и доступны для использования. Однако свойство DataSource имеет значение null. Есть ли простой способ вернуть исходный источник данных?

Я тогда подумал о перестройке источника данных из информации в диапазоне. Линия range.Activate() выбирает список в Excel (поэтому я знаю, что он имеет правильную вещь). Тем не менее, я не могу на всю жизнь разобраться, как получить данные из этого диапазона и получить адрес диапазона. В документации MSDN говорится о свойстве Address, но это фактически не существует. (Документация MSDN для VSTO в лучшем случае кажется канатной).

+0

Откуда вы знаете, что «коллекция элементов управления пуста»? Как пытаться завладеть коллекцией элементов управления? Как вы пытаетесь получить ListObject в коде? Пожалуйста, отредактируйте этот вопрос, чтобы включить этот код. – shahkalpesh

+0

Коллекция элементов управления пуста, потому что свойство Count возвращает 0. –

ответ

1

Вы пробовали? Microsoft.Office.Tools.Excel.ListObject ли = Microsoft.Office.Tools.Excel.ListObject.GetVstoObject (л) (это C# Я не уверен в VB)

От MSDN GetVstoObject, обязательно прочитайте замечание ,

1

О первом вопросе, вы создали listOject с кодом

ListObject lo = ws_vsto.Controls.AddListObject(range, "MyList"); 

Для восстановления объекта после сохранения/reope книгу, попробуйте следующую строку кода:

ListObject lo = Globals.Factory.GetVstoObject(Worksheet.ListObjects["MyList"]); 
0

Вы просто не может вернуть элемент управления ListObject, который вы создали динамически во время выполнения. это от MSDN documentation.

По умолчанию, динамически созданные объекты списка не сохраняется в листе в качестве элементов управления хоста, когда рабочий лист закрыт.

Единственный способ вернуть свой объект ListObject - это создать их непосредственно в листах моего шаблона во время разработки.

4

Я внес следующие изменения в исходный код. Вам нужно получить VSTO Listobject обратно с Factory.

 var wb = Globals.ThisAddIn.Application.ActiveWorkbook; 
     var wb_vsto = wb.GetVstoObject(); 


     foreach (Excel.Worksheet ws in wb.Worksheets) 
     { 
      var wsv = ws.GetVstoObject(); 
      foreach (Excel.ListObject l in ws.ListObjects) 
      { 
       MessageBox.Show(l.Name); 
       //var lo = wsv.Controls.AddListObject(l); 
       Microsoft.Office.Tools.Excel.ListObject lo = 
          Globals.Factory.GetVstoObject(l); 
       // I can now get at the datasource if neede 
       var ds = lo.DataSource; 
       // In my case the datasource was DataTable. 
       DataTable t = (DataTable)d; 

       if (t.Rows.Count > 0) 
       { 
        foreach (DataRow r in t.Rows) 
        { 
        // Access row data. 
        } 
       } 
       //Excel.Range range = lo.Range; 
       //range.Activate(); 
      } 
     } 
Смежные вопросы