C # excel получение уровня документа из созданного с # рабочего листа

Я пытался добавить поле со списком или действительно любые элементы управления формой на лист Excel, который был создан на лету. Мне удалось добавить поле со списком на лист Excel при создании проекта книги Excel в C # и получить доступ к функции Controls.AddComboBox на уровне документа (Sheet1) следующим образом: Рис.

namespace ExcelWorkbook2{
   public partial class Sheet1{
     private void Sheet1_Startup(object sender, System.EventArgs e){
       Microsoft.Office.Tools.Excel.Controls.ComboBox comboBox1  
          =this.Controls.AddComboBox(this.Range["A1", "A1"], "comboBox1");
          comboBox1.Items.Add("1 Item");

this относится к листу 1. Этот код отлично работает при создании проекта книги, но когда я создаю лист Excel на лету, вот так: Рис.

Application xlApp = new Application();
xlApp.Visible = true;
Workbook wb = xlApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Worksheet ws = (Worksheet)wb.Worksheets[1];

Я не могу войти в WorkSheet (ws) и получить "controls.AddCombobox". Помещение рабочего листа (рис. 2) в быстрое наблюдение говорит о том, что System .___ Comobject «этот» объект в другом проекте (рис. 1) возвращает значение (ExcelWorkbook2.Sheet1). Как я могу получить доступ к Controls.AddCombobox, который представлен как WorkSheetBase для использования в созданном C # листе (рис. 2). Спасибо


person AC25    schedule 05.09.2013    source источник
comment
Я не слишком много использовал Microsoft.Office.Tools.Excel, но, похоже, он имеет приятную структуру, похожую на обычные элементы управления в C #. Взаимодействие (как я понимаю, у вас есть в приведенном ниже коде) - это совершенно другая история: он не соответствует типичной структуре управления .NET, а соответствует исходной структуре VBA. Например, поля со списком связаны с диапазонами (отличаются от стандартных полей со списком .NET). Возможно, вам следует получить полный рабочий код (довольно много в MSDN), чтобы лучше понять этот новый формат (для вас), прежде чем переходить к более конкретным проблемам.   -  person varocarbas    schedule 05.09.2013
comment
Я смог запустить рабочий код и добавил поле со списком. Я создал проект книги в Visual Studio и смог добавить элемент управления в ячейку (рис. 1). Я пытаюсь сделать то же самое для листа Excel, сгенерированного кодом С # (рис. 2), но рабочий лист в нем, похоже, имеет несколько свойств, возможно, из-за того, что я не нахожусь в объекте листа Excel при создании листа Excel   -  person AC25    schedule 05.09.2013
comment
Это то, что я попытался объяснить вам в своем первом комментарии: теперь (во втором коде) вы имеете дело с Office Interop, где правила другие. Я рекомендовал вам получить полный рабочий код, чтобы привыкнуть к новому формату (он даже не учитывает поля со списком), иначе вы столкнетесь с постоянными проблемами (из-за непонимания, что происходит). Здесь у вас есть ссылка на полный рабочий код: support.microsoft.com/kb/302084 / ru-ru. Запустите его, разберитесь, как работает Interop, и беспокойтесь о выпадающих списках, когда все эти идеи станут вам полностью понятны.   -  person varocarbas    schedule 05.09.2013
comment
PS: как только ваши идеи станут ясны, имейте в виду, что поле со списком в этом формате называется DropDown (xlDropDown).   -  person varocarbas    schedule 05.09.2013
comment
Я действительно запускал и создавал этот код раньше, и я также использовал раскрывающийся список, в раскрывающемся списке есть события, как и в элементах управления, у них есть ddl.onaction = (событие изменения), которое переходит к макросу, который я выбрал или хотел бы работать с combobox sicne, я могу вернуться к С #   -  person AC25    schedule 05.09.2013
comment
Честно говоря, у меня никогда не было таких проблем. Если я хочу, чтобы что-то запускалось в Excel, я полагаюсь на макросы; если я хочу, чтобы что-то запускалось на C # и, в конечном итоге, для связи с Excel (обычно просто для поиска информации), я использую C #. Таким образом, я не уверен в точной точке автоматизации Excel с помощью C # для получения событий в Excel. Ясно то, что раскрывающийся список отличается от обычного поля со списком .NET. Если вас так интересует этот вопрос, проведите более глубокое исследование / тестирование. Если вы хотите получить здесь помощь, вам следует изменить заголовок / содержание вашего вопроса. Я ничем не могу больше помочь.   -  person varocarbas    schedule 05.09.2013
comment
Итак, вы говорите, что я не могу использовать поле со списком в с # сгенерированном коде или в коде Interop, поскольку то, что я пытался сделать, было, когда ячейка дважды щелкала в Excel, преобразовывала эту ячейку в комбо или раскрывалась, заполняла ее данными и проверяла его и преобразовать обратно в текст. Поле со списком было идеальным, потому что в нем были события.   -  person AC25    schedule 05.09.2013
comment
(Это начинает становиться мне знакомым) Пожалуйста, поймите две идеи, которые я собираюсь объяснить, и постарайтесь не расширять этот разговор слишком сильно. Ваша форма C # - это одно, а Excel (доступ к которому осуществляется через взаимодействие) - другое. Вы не можете перенести элементы из формы в Excel, вы должны использовать те, которые есть (например, раскрывающийся список). Вы можете использовать поля со списком только внутри форм. Это все, что я говорю: правила Excel разные, изучите их, примите их и, если они вам не нравятся, просто не полагайтесь на взаимодействие.   -  person varocarbas    schedule 05.09.2013
comment
хорошо, но я не использую для этого форму. Я использовал проект Excel Workbook, чтобы использовать поле со списком, если я не могу использовать его в Excel.Interop, тогда все в порядке   -  person AC25    schedule 05.09.2013


Ответы (1)


Controls.AddCombobox доступен только для Host Items пространства имен Microsoft.Office.Tools.Excel. В вашем случае Sheet1 - это ведущий элемент, который создается во время разработки.

Таблицы, созданные во время выполнения ..

... не может содержать никаких хост-элементов управления или элементов управления Windows Forms.

Чтобы создать ComboBox на листе во время выполнения, который обрабатывает события на C # и избегает VBA:

Ссылки на сборки:
Microsoft.Vbe.Interop (Microsoft.Vbe.Interop.dll)
Microsoft.Vbe.Interop.Forms (Microsoft.Vbe.Interop.Forms.dll)
Microsoft.VisualBasic (Microsoft.VisualBasic.dll)

Протестированный / рабочий код:

using MSForms = Microsoft.Vbe.Interop.Forms;
using System.Windows.Forms;

...

// insert object shape
Excel.Shape cbo = ws.Shapes.AddOLEObject("Forms.ComboBox.1", Type.Missing, false, false, Type.Missing, Type.Missing, Type.Missing, 20, 1, 100, 20);
cbo.Name = cboName;

// bind it and wire it up
MSForms.ComboBox comboBox = (Microsoft.Vbe.Interop.Forms.ComboBox)Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(ws, null, cboName, new object[0], null, null, null);
comboBox.FontSize = 10;
comboBox.FontBold = true;
comboBox.Change += new MSForms.MdcComboEvents_ChangeEventHandler(comboBox_Changed);

// samle data
comboBox.AddItem("Stackoverflow");
comboBox.AddItem("Cool devs");

...

private void comboBox_Changed()
{
    System.Windows.Forms.MessageBox.Show("Selectiong Changed!");
}

Чтобы создать кнопку на листе во время выполнения, которая обрабатывает события на C # и избегает VBA

Пожалуйста, поддержите своими голосами и комментариями. Спасибо, Лео.

person Leo Gurdian    schedule 19.10.2017