Excel控件 – dynamic删除combobox

我已经dynamic地在工作表中添加了combobox,并且我想在两个事件结束时dynamic地删除combobox – 特别是combobox.LostFocus和combobox.KeyDown事件。

它目前适用于两种情况:

  1. 使用手动从下拉菜单中select一个项目
  2. 用户部分键入一个项目,自动完成填充其余部分,然后用户敲击键盘input。

如果用户inputselect的整个文本并按下回车键,则不起作用。 我收到消息:

COMException被用户代码取消:无法获取OLEObject类的Name属性

Visual Studio指向行'sheetVSTO.Controls.Remove(myBox);' 在myBox_LostFocus事件处理程序中作为失败的来源。

用户显示能够将整个文本input到combobox中并按下回车键。 任何帮助,将不胜感激。

这是我的(如果需要更详细的信息,请告诉我):

private void AddComboBox(String[] list) { Excel.Worksheet sheet = Globals.ThisAddIn.Application.ActiveSheet; Microsoft.Office.Tools.Excel.Worksheet sheetVSTO = Globals.Factory.GetVstoObject(sheet); Excel.Range cell = Globals.ThisAddIn.Application.ActiveCell; Microsoft.Office.Tools.Excel.Controls.ComboBox myBox= new Microsoft.Office.Tools.Excel.Controls.ComboBox(); myBox.Name = "button1"; myBox.Items.AddRange(list); myBox.KeyDown += new KeyEventHandler(myBox_KeyDown); myBox.LostFocus += new EventHandler(myBox_LostFocus); myBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend; myBox.AutoCompleteSource = AutoCompleteSource.ListItems; myBox.Focus(); Microsoft.Office.Tools.Excel.ControlSite myBoxControl = sheetVSTO.Controls.AddControl(myBox, cell, boxName); } void myBox_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == System.Windows.Forms.Keys.Enter) { Microsoft.Office.Tools.Excel.Controls.ComboBox myBox = sender as Microsoft.Office.Tools.Excel.Controls.ComboBox; Excel.Worksheet sheet = Globals.ThisAddIn.Application.ActiveSheet; if (myBox.SelectedIndex > -1) { Microsoft.Office.Tools.Excel.Worksheet sheetVSTO = Globals.Factory.GetVstoObject(sheet); sheetVSTO.Controls.Remove(myBox); } } } void myBox_LostFocus(object sender, EventArgs e) { Microsoft.Office.Tools.Excel.Controls.ComboBox myBox = sender as Microsoft.Office.Tools.Excel.Controls.ComboBox; Excel.Worksheet sheet = Globals.ThisAddIn.Application.ActiveSheet; Microsoft.Office.Tools.Excel.Worksheet sheetVSTO = Globals.Factory.GetVstoObject(sheet); sheetVSTO.Controls.Remove(myBox); } 

我find了答案!

我改变了我的2删除电话:

 myBox.BeginInvoke(new MethodInvoker(delegate { sheetVSTO.Controls.Remove(myBox); }));