2012-09-25 3 views
1

내 워크 시트에 동적으로 콤보 상자를 추가 했으므로 combobox.LostFocus 및 combobox.KeyDown 이벤트의 두 이벤트가 끝날 때 동적으로 콤보 상자를 삭제하려고합니다.Excel 컨트롤 - 동적으로 콤보 상자 삭제

그것은 현재 두 가지 시나리오에 대해 작동합니다

사용은 수동으로
  • 사용자의 일부 유형의 항목에서의 메뉴에서 항목을 선택하고 다음 사용자 히트 입력, 나머지 채우기를 자동으로 완료
    1. 키보드에.

    사용자가 전체 텍스트를 선택하여 입력하고 Enter 키를 누르면 작동하지 않습니다.

    COMException가 사용자 코드에 의해 unhanded했다 : 나는 메시지를 얻을

    비주얼 스튜디오 점 라인 'sheetVSTO.Controls.Remove (myBox)에 OLEObject입니다 클래스의 이름 속성을 가져올 수 없습니다를; ' 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

    귀하의 질문에 더 잘 답변하기 위해 전체 텍스트 항목은 자동 완성 소스에 있습니다. 하지만 전체 항목을 입력하면 자동 완성 드롭 다운이 사라집니다. – scifirocket

    답변

    0

    나는 답을 발견!

    내가이 내이 제거 호출을 변경 :

    myBox.BeginInvoke(new MethodInvoker(delegate { sheetVSTO.Controls.Remove(myBox); })); 
    
    관련 문제