2013-08-23 1 views
1

내 Excel 추가 기능에 winform 대화 상자가 있는데, 패널 단추를 클릭 할 때 팝업됩니다. 워크 시트에 선택 변경 이벤트가 추가되었습니다. 이벤트가 처음 해고되지 않습니다. 대화 상자를 닫고 다시 열어야합니다. 이번에는 작동합니다. 여기에 뭔가 빠져 있거나 interop API를 능가하는 버그가 있습니까?Excel 워크 시트 SelectionChange 이벤트가 firsr 시간에 작동하지 않지만 두 번째로 작동합니다.

Enviornment : 엑셀 2007, .NET 4.0, 상호 운용성 런타임 : V1.1.4322

다음은 후

private void smartTemplateBtn_Click(object sender, EventArgs e) 
{ 
     Range SelectedRange = Globals.ThisAddIn.Application.Selection; 
     if (SelectedRange != null) 
     { 
      List<string> DataSetLabels = new List<string>(); 
      foreach (Range cell in SelectedRange.Cells) 
      { 
       if (cell.Value2 != null && !cell.Value2.Equals("")) 
       { 
        if (!DataSetLabels.Contains(cell.Value2)) 
        { 
         DataSetLabels.Add(cell.Value2); 
        } 
       } 
      } 
      if (DataSetLabels.Count > 0) 
      { 
       PopupCreateColumnDialog(DataSetLabels); 
      } 
     } 
} 

public void PopupCreateColumnDialog(List<string> DataSetLabels) 
{ 
     if (DataSetLabels.Count > 0) 
     { 
      CreateColumn colDialog = new CreateColumn(); 
      colDialog.TopMost = true; 
      colDialog.Show(); 
     } 
} 
+0

코드가 올바르게 표시됩니다. CreateColumn()이 잘못 호출 되었기 때문에 (너무 늦게 또는 두 번 이상 등) 또는이 이벤트의 동작에 영향을주는 다른 이벤트 (예 : 응용 프로그램 종료)를 선언했기 때문에 문제가 발생할 수 있습니다. 빠른 도움말을 얻으려면 코드를 더 작성하거나이 부분을 조금 더 잘 사용하는 방법을 설명해야합니다. – varocarbas

+0

@varocarbas 안녕하세요, 답장을 보내 주셔서 감사합니다. 이 대화 상자가 호출되는 방법을 보여주기 위해 게시물을 편집했습니다. –

+0

이 코드에서 이해할 수있는 것부터 : 먼저 주어진 스프레드 시트에 연결하고 Excel.Worksheet 변수를 정의합니다. 이 변수 (모든 선택된 셀)에서 특정 범위를 얻고 있습니다. 특정 조건이 충족되면 (둘 이상의 요소가있는 DataSetLabels) 열 비트를 호출합니다. 이 부분에서는 워크 시트 (아마도 이전과 같음)와 이벤트를 할당합니다. 내 질문은 : 왜 스프레드 시트를 처음 정의 할 때 이벤트 (이 이벤트와 다른 이벤트를 사용할 것인가)를 지정하지 않는 이유는 무엇입니까? – varocarbas

답변

1

를 호출되고이 열을 생성하는 방법입니다 코드

public partial class CreateColumn : Form 

    { 

    public CreateColumn() 
    { 
     InitializeComponent(); 
     Excel.Worksheet ws = Globals.ThisAddIn.Application.ActiveSheet; 
     //Bug: this event does not fire the first time.. works on second time. 
     ws.SelectionChange += new Excel.DocEvents_SelectionChangeEventHandler(ColRangeSelChange); 

    } 

    public void ColRangeSelChange(Excel.Range target) 
    { 
     System.Windows.Forms.MessageBox.Show(target.AddressLocal); 
    }} 

입니다 귀하의 의견을 읽고, 나는이 문제 (및 잠재적으로 발생할 수있는 다른 것들)가 Excel과의 비 - 너무 - 좋은 의사 소통에서 비롯된 것이라고 생각합니다. 따라서이 질문은 어떤 문제도 일으키지 않아야하는 구조를 보여 주기만하면됩니다.

응용 프로그램을 시작할 때 (또는 지정된 Excel 파일을 분석 할 때) 바로 Excel 개체, 워크 북 및 처리 할 워크 시트 (첫 번째 파일)를 정의해야합니다. 나는 당신의 예에 따라 워크 시트에 초점을 맞출 것이다 : 당신이 정의를 변경할 필요하지 않은이 스프레드 시트를 처리하는 동안

public void ColRangeSelChange(Excel.Range target) 
{ 
    System.Windows.Forms.MessageBox.Show(target.AddressLocal); 
} 

:

Excel.Worksheet ws = Globals.ThisAddIn.Application.ActiveSheet; 
ws.SelectionChange += new Excel.DocEvents_SelectionChangeEventHandler(ColRangeSelChange); 

ColRangeSelChange에 의해 정의된다. 이제 주어진 메소드 (ColRangeSelChange)는 주어진 이벤트 (ColRangeSelChange)와 연관되며 매번 호출되어 이벤트가 트리거됩니다. 워크 시트 및 이벤트를 계속 재정의하면 조정 관련 문제가 발생할 수 있으며 이상한 상황이 발생할 수 있습니다.

ActiveSheet을 통해 다른 스프레드 시트의 계정을 원할 경우 다른 변수로이 프로세스를 다시 실행해야합니다 (변수 할당 및 이벤트 할당).

요약 : 워크 시트와 이벤트 정의를 모두 CreateColumn()에서 제거하십시오. 주어진 워크 시트 (smartTemplateBtn_Click 이전)와의 상호 작용을 시작하기 전에이 권한을 넣으십시오. 그리고 이벤트를 한 번 (시작 부분에) 정의하고 해당 워크 시트를 변수에 한 번 (시작 부분에) 지정해야합니다.

+0

감사합니다.이 코드는 도움이되었습니다. 코드를 재구성하여 사용해보십시오. –

+0

@Rajeev 어땠어? 문제를 해결 했습니까? – varocarbas

+0

예, 효과가있었습니다. 올바른 접근 방식이었습니다. 이제 시작시 시트를 반복하고 이벤트를 첨부했습니다. 이제는 일관되게 작동합니다. 그러나 디버그 모드에서만 작동하며 이벤트 처리기에 중단 점을 넣을 때까지 조사하고 있지만 이전 문제는 해결됩니다. 도와 줘서 고마워. –