트레이닝 센터

엑셀 입출력

Spread에서 구현하는 Excel의 삭제, 실행 취소, 다시 실행 기능

Spread Winform에서 delete 키로 데이터 삭제를 구현하려면 코드를 사용해야 합니다.

선택 가능한 3가지 방법:

  • KeyDown 이벤트 사용
  • Action 사용자 지정
  • UndoAction 사용자 지정

최종 결과 스크린샷:


만약 A4:B5의 8개 셀을 선택했다고 가정합니다. excel에서는 delete 키를 누르면 8개 셀 내 데이터를 전부 삭제합니다.


KeyDown 이벤트 응답

현재 키가 delete 키인지 확인한 후 selection된 영역을 ActiveSheet.ClearRange 사용하여 컨텐츠를 삭제 합니다.

 this.fpSpread1.KeyDown += new KeyEventHandler(spread_KeyDown);
  
  private void spread_KeyDown(object source, KeyEventArgs e)
          {
              if (e.KeyCode == Keys.Delete)
              {
                  FpSpread spread = (FpSpread)source;
                  int selectionCount = spread.ActiveSheet.SelectionCount;
                  if (selectionCount > 0)
                  {
                      for (int i = 0; i < selectionCount; i++)
                      {
                          CellRange range = spread.ActiveSheet.GetSelection(i);
                          spread.ActiveSheet.ClearRange(range.Row, range.Column, range.RowCount, range.ColumnCount, true);
                      }
                  }
                  else
                  {
                      int activeRow = spread.ActiveSheet.ActiveRowIndex;
                      int activeColumn = spread.ActiveSheet.ActiveColumnIndex;
                      spread.ActiveSheet.ClearRange(activeRow, activeColumn, 1, 1, true);
                  }
                  e.Handled = true;
              }
          }

Action 사용자 지정

스프레드 자체가 많은 바로 가기 키(Short Key)가 존재하지만 때로는
FarPoint.Win.Spread.Action에서 사용자 지정 바로 가기 키를 구현해야 할 때가 있습니다.

여기서는 간단하게 Delete 키를 이용하여 새로운 사용자 정의 바로 가기 키를 구현하는 방법을 설명합니다. 영역을 지정하여 Delete키를 눌렀을 때 셀이 잠긴 상태에서 그대로 두고 잠기지 않은 셀은 초기화 시킵니다.

public class ClearValueAction : FarPoint.Win.Spread.Action
    {
        public override void PerformAction(object source)
        {
            if (source is SpreadView)
            {
                SpreadView spread = (SpreadView)source;
                SheetView sheet = spread.Sheets[spread.ActiveSheetIndex];
                CellRange cr = sheet.GetSelection(0);
                StyleInfo si = new StyleInfo();


                for (int r = 0; r < cr.RowCount; r++)
                {
                    for (int c = 0; c < cr.ColumnCount; c++)
                    {
                        sheet.Models.Style.GetCompositeInfo(cr.Row + r, cr.Column + c, -1, si);
                        if (!si.Locked)
                        {
                            sheet.Cells[cr.Row + r, cr.Column + c].ResetValue();
                        }
                    }
                }
            }
        }
    }
private void Form1_Load(object sender, EventArgs e)
    {
        InputMap im = fpSpread1.GetInputMap(InputMapMode.WhenFocused);
        ActionMap am = fpSpread1.GetActionMap();
        im.Put(new Keystroke(Keys.Delete, Keys.None), "ClearValue");
        am.Put("ClearValue", new ClearValueAction());
    }

Undo 기능 사용자 지정

삭제하는 기능이 있으면 Undo도 필요하게 됩니다. 만약에 실수로 삭제했다면 어떻게 해야 할까요? Spread의 UI는 Excel과 매우 비슷합니다. Undo, Redo 작업을 구현하는 법도 Spread에서는 매우 간단합니다.

UndoAction 유형을 상속해 매번 실행 취소, 다시 실행을 아래와 같이 구현할 수 있습니다.

this.fpSpread1.GetInputMap(InputMapMode.WhenFocused).Put(new Keystroke(Keys.Delete, Keys.None), FarPoint.Win.Spread.SpreadActions.ClearSelectedCells);
this.fpSpread1.GetActionMap().Put(SpreadActions.ClearSelectedCells, new ClearSelectedCellsUndoAction());
  
  
public class ClearSelectedCellsUndoAction : FarPoint.Win.Spread.UndoRedo.UndoAction
{
     SpreadView spreadView = null;                         
	// SpreadView where action happens
    FarPoint.Win.Spread.SheetView activeSheet = null;     
	// active SheetView in root workbook
        FarPoint.Win.Spread.SheetView sheet = null;           
	// SheetView where action happens 
         FarPoint.Win.Spread.Model.CellRange cellRange = null; 
	// CellRange being cleared
         DataObject clipData = null;                           
	// DataObject containing data from CellRange
 
public override bool PerformUndoAction(object sender)
{
         SpreadView rootWorkbook = sender as SpreadView;     
	// sender is always root SpreadView when called from UI
 
        if (rootWorkbook != null) // but sender might be null if other code calls this, so check!
        {
             activeSheet = rootWorkbook.Sheets[rootWorkbook.ActiveSheetIndex]; 
		// save active SheetView (to restore on undo)
            spreadView = rootWorkbook.GetActiveWorkbook();                   
 		// save active SpreadView (to restore on undo)
 
 	    sheet = spreadView.GetSheetView();                                
		// get SheetView to operate on
                 cellRange = sheet.GetSelection(sheet.SelectionCount - 1);        
		// get CellRange to operate on
                 if (cellRange == null)  
		// GetSelection return null if there is no selection, just active cell
                     cellRange = new CellRange(sheet.ActiveRowIndex, sheet.ActiveColumnIndex, 1, 1); 
		// use active cell in this case
            }
            if (SaveUndoState()) // save data from range
             {
		 // then clear it
                 sheet.ClearRange(cellRange.Row, cellRange.Column, cellRange.RowCount, cellRange.ColumnCount, false);
                 return true;
             }
             return false; 
		// something failed, return false to discard action from undo stack
         }
  
         protected override bool SaveUndoState()
         {
              if (cellRange != null)
		 // need CellRange set in PerformUndoAction (implied sheet is valid)
                  clipData = sheet.GetClipDataObject(false, cellRange, ClipboardCopyOptions.All); 
		// save data object for cell range
              return clipData != null;
          }
  
          public override bool Undo(object sender)
          {
              SpreadView rootWorkbook = sender as SpreadView;
              if (rootWorkbook != null)
              {
                  rootWorkbook.ActiveSheetIndex = rootWorkbook.Sheets.IndexOf(activeSheet); 
		// restore active sheet (in case user changed it)
                  rootWorkbook.SetActiveWorkbook(spreadView);
		 // restore active workbook in sheet (in case user changed it)
                  sheet.ClearSelection(); // reset selection (clear, then add)
                  sheet.AddSelection(cellRange.Row, cellRange.Column, cellRange.RowCount, cellRange.ColumnCount);
                  sheet.ClipboardPaste(ClipboardPasteOptions.All, clipData); 
		// paste data pack from data object
                  return true;
              }
              return false;
          }
      }

 }

샘플 다운로드



한국 그레이프시티 공식카페에서 기술지원을 받으실 수 있습니다.
이메일을 통해서도 기술지원을 받으실 수 있습니다.