2016-12-01 4 views
1

DataGridView에서 파생 된 사용자 정의 컨트롤에서 Ctrl + C 복사 작업을 구현하려고합니다.데이터가 있거나없는 DataGridView의 키 누르기 수정 자

데이터 격자보기에서 선택한 셀을 복사하려면 Ctrl + C를, 셀 열 머리글 텍스트는 으로 복사하려면 Ctrl + Shift + C를 누릅니다.

두 개의 복사 루틴을 설정했으며 제대로 작동합니다. 내가 겪고있는 문제는 key_down 처리기를 할당하는 것입니다. 여기에 이해가 안 비트입니다 : 나는이 빈 그리드 시도 (즉, 데이터가없는, 열 등), 내가 얻을

protected virtual void DataGridViewEx_KeyDown(object sender, KeyEventArgs e) 
    { 
     System.Diagnostics.Debug.WriteLine("-------------------------------"); 
     System.Diagnostics.Debug.WriteLine("KeyCode = " + e.KeyCode.ToString()); 
     System.Diagnostics.Debug.WriteLine("KeyValue = " + e.KeyValue.ToString()); 
     System.Diagnostics.Debug.WriteLine("KeyData = " + e.KeyData.ToString()); 
     System.Diagnostics.Debug.WriteLine("Modifiers = " + e.Modifiers.ToString()); 
     System.Diagnostics.Debug.WriteLine("-------------------------------"); 


     if ((e.Control & e.Shift) && e.KeyCode == Keys.C) 
     { 
      System.Diagnostics.Debug.WriteLine("CTRL+SHIFT+C Pressed"); 
      CopyToClipboard(CopyMode.SelectedCellsWithHeaders); 
      e.Handled = true; 
     } 
     if (e.Control && e.KeyCode == Keys.C) 
     { 
      System.Diagnostics.Debug.WriteLine("CTRL+C Pressed"); 
      CopyToClipboard(CopyMode.SelectedCellsOnly); 
      e.Handled = true; 
     } 

     else if (e.Control && e.KeyCode == Keys.V) 
     { 
      PasteClipboard(); 
      e.Handled = true; 
     } 
    } 

이제 다음은

내를 keyDown 코드 다음

Ctrl + C :

에서 KeyCode = C 키 값 = 67 KeyData = C, 시프트, 컨트롤 수정 = 시프트, 계속 ROL

Ctrl 키 + Shift + C

에서 KeyCode = C 키 값 = 67 KeyData = C, 시프트, 컨트롤 수정 = 시프트, 컨트롤

하지만 : 나는 일단 " 그리드에 데이터를 붙여 넣은 경우 똑같은 keydown 작업을 통해 다음 결과를 얻을 수 있습니다.

Ctrl + C

,515,

에서 KeyCode = C 키 값 = 67 KeyData = C 제어 수정 = 제어

Ctrl 키 + 시프트 + C

에서 KeyCode = ShiftKey 키 값 = 16 KeyData = ShiftKey , 시프트, 컨트롤 변경자 = 시프트, 컨트롤

그리드에 데이터가있을 때 "C"키 누르기가 더 이상 인식되지 않고 Ctrl + Shift 만 누릅니다.

셀이 편집 모드에 있지 않습니다 (Ctrl + C가 잘 작동하는 것을 볼 수 있음). 대신 Ctrl + K와 같은 것으로 변경할 수 있지만 여기에서 어떤 일이 벌어지고 있는지 이해하고 싶습니다. 어떤 아이디어?

답변

1

키 수정자는 KeyDown 이벤트 처리기에서 일부 고유 한 동작을합니다. 특수 복사 요구 사항에 대한 수정 자 검사를 처리하려면 수정 후 the 3rd part of my solution here을 따르는 것이 좋습니다.즉, DataGridView에서 상속하는 클래스를 생성 :

public class CopyDataGridView : DataGridView 
{ 
    public bool ProcessShiftCopy { get; set; } 

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     ProcessShiftCopy = keyData == (Keys.Control | Keys.Shift | Keys.C); 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 
} 

그런 다음이 단계를 수행하십시오

  1. 당신이 DataGridViewCopyDataGridView의 인스턴스로 교체하십시오.
  2. DataGridView.KeyDown 대신 CopyDataGridView.KeyUp 이벤트를 처리하십시오. KeyDown 키 수정자를 우리가 원하는 방식으로 트리거하지 않기 때문입니다. 그러나 KeyUp이됩니다.
  3. 은 교체 :

    if ((e.Control & e.Shift) && e.KeyCode == Keys.C) 
    

    로 :

    if (yourCopyDataGridView.ProcessShiftCopy) 
    

    Ctrl 키 + 시프트 + C을 처리 할 수 ​​있습니다.

+1

고맙습니다! 그것은 작동하고, 나는 무슨 일이 일어나고 있는지 알 것 같습니다. ProcessCmdKey가 여기서 무엇을하는지 살펴 보았습니다. [link] (https://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey%28v=vs.110%29.aspx?f = 255 & MSPPError = -2147217396). 컨트롤에 상황에 맞는 메뉴가 있는지 확인합니다. 글쎄, 내 컨트롤에 컨텍스트 메뉴가 있지만 Datagridview에 데이터가 있는지 만 보여줍니다. 내 예제에서는 상황에 맞는 메뉴가 표시되지 않을 때로드되는 데이터가없는 상태에서 작업 중이라고 생각합니다. – ainwood