2012-09-25 39 views
1

我已經動態地在工作表中添加了組合框,並且我想在兩個事件結束時動態刪除組合框 - 特別是combobox.LostFocus和combobox.KeyDown事件。Excel控件 - 動態刪除組合框

目前,它適用於兩種情況:

  1. 使用手動從下拉列表中的項目
  2. 用戶部分類型選擇一個項目,並自動完成填補了休息,然後用戶點擊進入在鍵盤上。

如果用戶輸入select的整個文本並按下回車鍵,則不起作用。我得到的消息:

收到COMException是由用戶代碼unhanded:無法OLEOBJECT類的名稱屬性得到

的Visual Studio點到線「sheetVSTO.Controls.Remove(myBox上); 「在myBox_LostFocus事件處理程序中作爲失敗的來源。

用戶顯示能夠將整個文本輸入到組合框中並按下回車鍵。任何幫助,將不勝感激。

這裏是我(讓我知道更詳細的需要):

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); 
    } 
+0

是完整的文本輸入失敗,包含在自動完成源項目的清單?或者你是否還需要添加新項目? – datatoo

+0

失敗的行在myBox_LostFocus事件處理程序中,特別是在'sheetVSTO.Controls.Remove(myBox)' – scifirocket

+0

以更好地回答您的問題,自動完成源中的完整文本項IS。但是當輸入完整的項目時,自動完成下拉列表消失。 – scifirocket

回答

0

我找到了答案!

我改變了我的2個刪除電話本:

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