11. 기타 [Winforms] Change 이벤트와 Ctrl+V
페이지 정보
작성자 GrapeCity 작성일 2021-11-17 15:06 조회 1,144회 댓글 0건본문
관련링크
스프레드에 데이터를 입력할 때, Ctrl + V와 같은 단축키를 사용하면 작업 효율을 크게 향상시킬 수 있습니다.
스프레드는 셀의 조작을 순간 포착할 수 있는 다양한 이벤트 기능을 제공하며, 그 중 Change 이벤트는 셀 데이터의 변화를 감지하여 셀 데이터가 수정된 후 발생하는 이벤트입니다. 그러나 Change 이벤트는 Ctrl + V를 통한 변화를 감지할 수 없어, 해당 단축키로 데이터를 입력했을 때 이벤트가 발생하게 하기 위해서는 Change 이벤트 내부에 이를 확인하는 코드를 추가해야 합니다.
본문에서는 Ctrl+V로 인한 셀 데이터 변화를 Change 이벤트가 감지하게 하는 방법을 살펴보겠습니다.
도구상자에서 FpSpread 컨트롤을 찾아 Form으로 가져옵니다.
아래 코드를 사용하여, 컨트롤의 네 모서리가 Form의 네 모서리에 도킹되게 합니다. Form의 크기 변화에 따라 스프레드 컨트롤의 사이즈도 함께 변화하게 됩니다.
fpSpread1.Dock = DockStyle.Fill;
코드 상에 Change 이벤트와 KeyDown 이벤트를 추가합니다.
Change 이벤트: 사용자가 셀 데이터를 수정한 후에 발생합니다.
KeyDown 이벤트: 컨트롤에 포커스가 있는 동안 키를 누르면 발생합니다.
fpSpread1.Change += new ChangeEventHandler(fpSpread1_Change); fpSpread1.KeyDown += new KeyEventHandler(fpSpread1_KeyDown);
Change 이벤트를 정의합니다. 예제에서는 셀 데이터가 수정되었을 때 메세지 박스에 "Change Event Occured!"라는 메세지가 나타나도록 코드를 추가하였습니다.
private void fpSpread1_Change(object sender, ChangeEventArgs e) { MessageBox.Show("Change Event Occured!"); }
KeyDown 이벤트를 정의합니다. 우선, 조건문을 사용하여 키가 눌렸을 때 눌린 키가 Ctrl + v인지 확인합니다.
private void fpSpread1_KeyDown(object sender, KeyEventArgs e) { if(e.Control && (e.KeyCode == Keys.V)) { ... } }
조건문 내부에서 Change 이벤트를 호출하여, Ctrl+V 가 눌렸을 때 Change 이벤트가 발생하도록 합니다.
int row = fpSpread1.ActiveSheet.ActiveRowIndex; int col = fpSpread1.ActiveSheet.ActiveColumnIndex; ChangeEventArgs param = new ChangeEventArgs(null, row, col); fpSpread1_Change(null, param);
코드를 실행하면, 셀에 새로운 데이터를 입력하거나 Ctrl+V를 눌렀을 때 Change 이벤트가 발생하는 것을 확인할 수 있습니다.
단, 위 상태에서는 빈 셀을 Ctrl+C 하여 다른 셀에 Ctrl+V를 했을 때에도 Change 이벤트가 발생합니다. 또는 데이터가 입력된 셀에 동일한 데이터를 Ctrl+C 후 Ctrl+V를 눌러 붙여넣어도 해당 이벤트가 발생합니다. 이처럼 데이터 변경 없이 Change 이벤트가 발생하는 것을 방지하기 위해, 다음과 같이 조건문을 추가하여 KeyDown 이벤트를 수정할 수 있습니다.
object value; private void fpSpread1_KeyDown(object sender, KeyEventArgs e) { if (e.Control && (e.KeyCode == Keys.V)) { if (value != fpSpread1.ActiveSheet.ActiveCell.Value) { int row = fpSpread1.ActiveSheet.ActiveRowIndex; int col = fpSpread1.ActiveSheet.ActiveColumnIndex; ChangeEventArgs param = new ChangeEventArgs(null, row, col); fpSpread1_Change(null, param); } } else if (e.Control && (e.KeyCode == Keys.C)) { int row = fpSpread1.ActiveSheet.ActiveRowIndex; int col = fpSpread1.ActiveSheet.ActiveColumnIndex; value = fpSpread1.ActiveSheet.Cells[row, col].Value; } }
샘플을 다운로드하여 전체 코드를 확인해 보실 수 있습니다.
지금 바로 Spread.NET을 다운로드하여 직접 테스트해보세요!
댓글목록
등록된 댓글이 없습니다.