2011-12-13 2 views
4

일부 데이터를 편집하기 위해 DataTable의 Data를 가져 오는 DataGridView를 사용합니다. 모든 것이 괜찮은 것처럼 보이지만 불편 함이 있습니다. 사용자가 셀 편집을 시작하면이 셀의 텍스트가 자동으로 선택되고 커서가 셀 텍스트의 끝으로 이동합니다. 사용자가 셀 텍스트를 편집하기 시작할 때 편집 셀의 텍스트 시작 부분에 커서 (캐럿)를 프로그래밍 방식으로 배치하려고합니다. 나는 시도했다 :사용자가 셀 텍스트를 편집 할 때 프로그래밍 방식으로 DataGridView 셀을 편집 할 때 텍스트 시작 부분에 커서를 놓는 방법?

private void gridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     DataGridViewTextBoxEditingControl dText = (DataGridViewTextBoxEditingControl)e.Control; 
     dText.Select(0, 0); 
    } 

그것은 작동하지 않는다. 또한 CellBeginEdit에서 텍스트 선택을 취소했습니다. 결과도 없습니다.

답변

8

나는 당신이 일한 것을 기대했을 것입니다. 그러나 DataGridView는 많은 이벤트가 포함 된 복잡한 컨트롤이며 종종 직관적으로 작동하지 않습니다. EditingControlShowing 이벤트가 발생하면 컨트롤이 아직 초기화되지 않았으므로 영향을받지 않습니다. CellBeginEdit 이벤트가 발생하면 컨트롤이 아직 만들어지지 않은 것입니다.

이있을 아마도 그것을 할 수있는 더 좋은 방법이지만, 나는 그것이 CellEnter 이벤트 사용하여 일을 가지고해야합니다, 셀 난 그냥 편집 모드로 직진 입력 할 때 그래서

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e) 
{ 
    if (dgv.CurrentCell.EditType == typeof(DataGridViewTextBoxEditingControl)) 
    { 
     dgv.BeginEdit(false);    
     ((TextBox)dgv.EditingControl).SelectionStart = 0; 
    } 
} 

을하지만, 거짓 ~ BeginEdit()을 전달하여 텍스트를 선택하지 않도록합니다. 이제 편집 컨트롤이 완전히 초기화되었고 SelectionStart을 0으로 설정하여 커서를 텍스트의 시작 부분으로 옮길 수 있습니다.

셀이 텍스트 상자가 아니면 아무 것도하지 않습니다. 당신은 당신이 시작 편집 할 때 완벽하게 제어 할 수 있도록

dgv.EditMode = DataGridViewEditMode.EditProgrammatically; 

을 할 수 싶지만이 필요하지 않습니다 찾을 경우

.

+0

나는이 해결책을 시도하고 일한다! 고맙습니다! – Alexander

+0

나는 몇 널 참조 예외 후 작은 정제를 추가 :'개인 서브 dataGridView1_CellEnter (개체로 보낸 사람, DataGridViewCellEventArgs으로 전자) Dgv.CellEnter 를 처리를 Dgv.CurrentCell.EditType = GetType을 (DataGridViewTextBoxEditingControl) 경우 DgGradeText.BeginEdit (거짓) Dim EditBox = DirectCast (Dgv.EditingControl, TextBox) IfNothing (EditBox) = False이면 EditBox.SelectionStart = 0 끝 인 경우 End Sub' –

관련 문제