[Winforms] 키보드 상호작용 > 온라인 스터디

본문 바로가기

Spread.NET

온라인 스터디

11. 기타 [Winforms] 키보드 상호작용

페이지 정보

작성자 GrapeCity 작성일 21-11-09 13:35 조회 180회 댓글 0건

본문

MS Excel을 사용할 때, Tab키를 눌러 다음 셀로 이동하거나, 단축키를 사용하는 등 키보드를 이용하여 상호작용할 때가 많습니다. Spread.NET에서도 사용자가 지정한 키를 누름으로써 특정 기능을 수행하도록 설정할 수 있습니다.

내부적으로, SpreadView 객체는 키스트로크를 처리하기 위해 InputMap과 ActionMap을 짝지어 사용합니다.

  • InputMap*키스트로크*액션 식별자로 변환하는 데 사용됩니다. 즉, 단축키를 지정하는 데 사용합니다.
  • ActionMap은 액션 식별자를 액션으로 변환하는 데 사용합니다. 즉, 단축키를 눌렀을 때 실행되는 동작을 지정합니다.

    키스트로크는 사용자가 누르는 키보드 키를 의미합니다.
    액션 식별자는 해당 키가 눌렸을 때 동작할 명령의 이름을 나타냅니다.


KeyDown 이벤트 처리

키를 누를 때 KeyDown 이벤트가 발생하며, 해당 이벤트를 처리하는 내부 코드는 다음과 같습니다.

  1. 먼저 InputMap에서 눌린 키에 대응되는 액션 식별자를 가지고 옵니다.

  2. 액션 식별자가 존재하면, 해당 식별자에 대응되는 액션을 가져옵니다.

  3. 액션이 존재하면, 해당 액션을 수행하고 이벤트 처리를 완료합니다.

object actionMapKey = GetInputMap(InputMapMode.WhenFocused).Get(new Keystroke(e.KeyCode, e.Modifiers));
if (actionMapKey != null)
{
  Action action = GetActionMap().Get(actionMapKey);
  if (action != null)
  {
   action.PerformAction(this);
  e.Handled = true;
  }
}

위 코드에서 알 수 있는 것과 같이, 특정 키가 눌렸을 때 그에 대응되는 Action 객체의 PerformAction 메소드가 실행됩니다. 따라서 특정 키에 대응되는 동작은 Action 클래스의 PerformAction 메소드에 정의되어야 합니다.


예제: 행 숨김 및 숨김해제 단축키 설정

예제를 통해 더 자세하게 살펴보겠습니다. Excel에서는 Ctrl+9Ctrl+Shfit+9를 사용하여 행을 숨기거나 행 숨김을 해제할 수 있습니다. Spread.NET에서도 InputMap과 ActionMap을 사용하여 해당 기능을 구현할 수 있습니다.

  1. 새 프로젝트를 생성하고, 도구상자에서 FpSpread 컨트롤을 찾아 Form으로 가져옵니다.

    01_AddFpSpread  

  2. 아래 코드를 사용하여, 컨트롤의 네 모서리가 Form의 네 모서리에 도킹되게 합니다.

    fpSpread1.Dock = DockStyle.Fill;

  3. HideRowAction 클래스를 선언합니다. HideRowAction 클래스는 Action 클래스를 상속받습니다.

    private class HideRowAction : Action
    {
    ...
    }

  4. HideRowAction 클래스 내부에 액션이 발생하면 호출될 PerformAction 메소드를 오버라이드합니다. 이때 PerformAction의 매개변수로는 액션이 발생한 객체가 사용됩니다.

    public override void PerformAction(object source)
    {
    ...
    }

  5. PerformAction 메소드 내부에 다음의 내용을 정의합니다.

    if (source is SpreadView)
    {
    SpreadView spread = (SpreadView)source;
      SheetView sheet = spread.Sheets[spread.ActiveSheetIndex];
       
      if (sheet.SelectionCount > 0)
      {
          for (int i = 0; i < sheet.SelectionCount; i++)
          {
              CellRange range = sheet.GetSelection(i);
              if (range.Row == -1)
                  sheet.Rows[0, sheet.RowCount - 1].Visible = false;
              else
                  sheet.Rows[range.Row, range.Row + range.RowCount - 1].Visible = false;
          }
    }
      else
      {
          sheet.Rows[sheet.ActiveRowIndex].Visible = false;
      }
    }

  6. 동일한 방식으로, 아래와 같이 UnhideRowAction 클래스를 정의합니다.

    private class UnhideRowAction : Action
    {
      public override void PerformAction(object source)
      {
        if (source is SpreadView)
        {
            SpreadView spread = (SpreadView)source;
            SheetView sheet = spread.Sheets[spread.ActiveSheetIndex];
            if (sheet.SelectionCount > 0)
            {
              for (int i = 0; i < sheet.SelectionCount; i++)
              {
                  CellRange range = sheet.GetSelection(i);
                  if (range.Row == -1)
                    sheet.Rows[0, sheet.RowCount - 1].Visible = true;
                  else
                    sheet.Rows[range.Row, range.Row + range.RowCount - 1].Visible = true;
              }
            }
            else
            {
              sheet.Rows[sheet.ActiveRowIndex].Visible = true;
            }
        }
      }
    }

  7. 이어서, InputMap과 ActionMap에 행 숨김 설정/해제를 위해 새로운 키스트로크와 액션을 매핑해보겠습니다.

  8. 먼저 스프레드 컨트롤의 InputMap과 ActionMap을 가져와 새로운 InputMap, ActionMap 객체를 생성합니다. 이때, InputMapMode를 WhenFocused로 설정하여, 해당 컨트롤이 활성화되어있을 때 InputMap이 적용되게 합니다.

    InputMap im = fpSpread1.GetInputMap(InputMapMode.WhenFocused);
    ActionMap am = fpSpread1.GetActionMap();

  9. InputMap 클래스의 Put 메소드를 사용하여, 지정된 키스트로크와 액션 식별자를 매핑합니다.

    im.Put(new Keystroke(Keys.D9, Keys.Control), "HideRow");
    im.Put(new Keystroke(Keys.D9, Keys.Control | Keys.Shift), "UnhideRow");

  10. ActionMap 클래스의 Put 메소드를 사용하여, 위에서 선언한 액션 식별자와 액션을 매핑합니다.

    am.Put("HideRow", new HideRowAction());
    am.Put("UnhideRow", new UnhideRowAction());

  11. 이제 지정된 키를 누르면, 해당 키에 대응되는 액션이 발생합니다. 즉, 코드를 실행시킨 후 Ctrl+9를 누르면 행이 숨겨지고, Ctrl+Shift+9를 누르면 숨겨진 행이 나타나는 것을 확인하실 수 있습니다.  

    02_HideAndUnhideRow


샘플을 다운로드하여 전체 코드를 확인해 보실 수 있습니다.

키보드 상호작용 - 샘플 다운로드




지금 바로 Spread.NET을 다운로드하여 직접 테스트해보세요!

spnet.png


  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

그레이프시티 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

인기글

더보기
  • 인기 게시물이 없습니다.
그레이프시티 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@grapecity.com | 전화 : 1670-0583 | 경기도 안양시 동안구 시민대로 230, B-703(관양동, 아크로타워) 그레이프시티(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 Copyright ⓒ 2022 GrapeCity inc.