2016-10-30 2 views
0

나는이 문제와 관련하여 몇 가지 코드를 가지고 있으므로이 질문을 다시 요청합니다. 이전 질문을 삭제했습니다.DataGridView TextBox 셀 편집, 변경 Tab 키로 활동 키 입력

기본적으로 입력란을 눌러 텍스트 상자 셀을 편집 할 때 Tab 키 (다음 행의 다음 행 대신 다음 행의 다음 항목)와 같은 역할을하고 싶습니다.

내 문제는 지금까지 시도한 대부분의 기능이 작동하지 않습니다. 그러나 이것은 현재 시도한 해결책이었습니다.

이 코드는 편집 또는 선택중인 셀을 변경하기로되어 있습니다.

private void PreTranslateDGV_KeyPressEvent(object sender, KeyEventArgs e) 
    { 
     DataGridViewTextBoxEditingControl a = (DataGridViewTextBoxEditingControl) sender; 
     //a.PreviewKeyDown -= PreviewKeyDownEventHandler (dataGridView1_PreviewKeyDown) 
     MyDataGridView s = (MyDataGridView) a.EditingControlDataGridView; 
     if (e.KeyCode == Keys.Enter) 
     { 
      e.SuppressKeyPress = true; 
      int newRow; 
      int newColumn; 
      if (s.CurrentCell.ColumnIndex == s.ColumnCount - 1)   // it's a last column, move to next row; 
      { 
       newRow = s.CurrentCell.RowIndex + 1; 
       newColumn = 0; 

       if (newRow == s.RowCount) 
        return; // ADD new row or RETURN (depends of your purposes..) 
      } 
      else    // just change current column. row is same 
      { 
       newRow = s.CurrentCell.RowIndex; 
       newColumn = s.CurrentCell.ColumnIndex + 1; 
      } 

      s.CurrentCell = s.Rows[newRow].Cells[newColumn]; 
     } 
    } 

은 셀의 텍스트 상자

private void PreTranslateDGV_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     DataGridViewTextBoxEditingControl tb = (DataGridViewTextBoxEditingControl)e.Control; 
     tb.KeyDown += new KeyEventHandler (PreTranslateDGV_KeyPressEvent); 
    } 

이 대부분 내가 잠시 동안 작업을 진행하기 위해 노력 해왔다로 I에 유래에서 발견 코드이었다 위의 이벤트를 추가하는 코드입니다.

누군가가 제대로 알 수있는 경우 데이터 입력 창에서 'Enter'키 누르기를 얻는다면 셀을 편집하는 동안 도움이됩니다.

추신 : 나는 MSDN 포럼 (손실 된 링크)에서 읽습니다. 텍스트 상자 셀을 편집 할 때 Enter 키를 누르면 편집이 중지됩니다. 위의 코드가 Enter 키를 누르지 않는 이유는 무엇일까요?하지만 다른 모든 것에 대해서는 실행됩니다.

은 지금 오버 타고

class MyDataGridView : KryptonDataGridView 
{ 
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     if ((keyData == Keys.Enter) && (this.EditingControl != null)) 
     { 
      return false; 
     } 
     //for the rest of the keys, proceed as normal 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 
} 

하지만 아무리 반환하는 것 무엇을 입력하지 키가 KeyPressEvent에 전달되지 않는 processcmdkey을이에 의해 수행을 시도하고있다.

답변

0

많은 후, 성가신 문제. 여기에 내가 현재 사용하고있는 솔루션 :

private void PreTranslateDGV_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
    { 
     DataGridViewTextBoxEditingControl a = (DataGridViewTextBoxEditingControl) sender; 
     //a.PreviewKeyDown -= PreviewKeyDownEventHandler (dataGridView1_PreviewKeyDown) 
     MyDataGridView s = (MyDataGridView) a.EditingControlDataGridView; 
     if (e.KeyCode == Keys.Enter) 
     { 
      int newRow; 
      int newColumn; 
      if (s.CurrentCell.ColumnIndex == s.ColumnCount - 1)   // it's a last column, move to next row; 
      { 
       newRow = s.CurrentCell.RowIndex + 1; 
       newColumn = 0; 

       if (newRow == s.RowCount) 
        s.Rows.Add(1); // ADD new row or RETURN (depends of your purposes..) 
      } 
      else    // just change current column. row is same 
      { 
       newRow = s.CurrentCell.RowIndex; 
       newColumn = s.CurrentCell.ColumnIndex + 1; 
      } 
      s.CurrentCell = s.Rows[newRow].Cells[newColumn]; 
     } 
    } 
    private void PreTranslateDGV_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     DataGridViewTextBoxEditingControl tb = (DataGridViewTextBoxEditingControl)e.Control; 
     tb.PreviewKeyDown -= PreTranslateDGV_PreviewKeyDown; 
     tb.PreviewKeyDown += PreTranslateDGV_PreviewKeyDown; 

     //e.Control.KeyDown += new KeyEventHandler(PreTranslateDGV_KeyPressEvent); 
    } 

은 내가 PreviewKeyDown 이벤트에의 KeyPressEvent을 변경했습니다. ProcessCmdKey가 입력을 받기 전에 시작됩니다. 이것과 수정 된 DataGridview를 사용하여 셀 내부에서 Tab 키와 같은 식으로 Enter 키를 얻을 수있었습니다.

class MyDataGridView : KryptonDataGridView 
{ 
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     if ((keyData == Keys.Enter) && (this.EditingControl != null)) 
     { 
      return true; 
     } 
     //for the rest of the keys, proceed as normal 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 
} 

ProcessCmdKey에 Enter 키가 주어진 경우 즉시 처리되었음을 나타내는 "true"를 반환합니다. 그것은 PreviewkeyDown 이벤트

가있다 는 희망이 다른 사람을 도움이됩니다. 나는 이것을 할 수있는 다른 방법이 얼마나 있는지 모르겠다. 그러나이 방법은 나를 위해 일했다.

관련 문제