2012-03-10 4 views
2

양식의 데이터 소스에 바인딩 된 표준 DataGridView가있는 Windows Form VS2010 .NET 4 프로젝트가 있습니다.WinForms의 DataGridView 편집 셀

그리드에는 클릭 한 캐릭터에서 점으로 편집 할 텍스트 컬럼이 있습니다. 조정하려는 문자를 클릭하면 일반 텍스트 상자/편집기와 같습니다. 가능한 경우 UP/DOWN 키를 사용하여 행 사이를 이동하고 싶지만 커서가 전체 텍스트를 선택하지 않고 동일한 열에서 같은 문자 위치로 이동하게하십시오.

나는 몇 가지 시도 :

DataGridView1.ClearSelection()를

는 BeginEdit는 또 다른 의미의 텍스트의 말에 커서를두고

DataGridView1.BeginEdit (거짓) 클릭하여 편집 할 문자 위치를 가리 킵니다.

DevExpress와 같은 상업용 그리드는 한 번의 클릭으로 정확한 문자 위치를 클릭 할 수 있지만 비용이 많이 드는 편집을 기본으로합니다.

나는 DataGridView1_EditingControlShowing 이벤트

If TypeOf e.Control Is System.Windows.Forms.DataGridViewTextBoxEditingControl Then 
     Dim tb As TextBox = e.Control 
     tb.SelectionStart = 5 
     tb.SelectionLength = 5 
End If 

에 시도하지만 아무것도하지 않습니다.

조정이 필요한 문자 위치로 이동하기 위해 두 번 또는 세 번의 클릭을 제거하려고합니다.

나는 Custom DataColumn을 아직 보지 않았다.

의견을 보내 주시면 대단히 감사하겠습니다.

답변

2

이 작업을 수행하는 데 좋은 방법이 없습니다. 가장 가까운 곳은 그리드의 EditModeEditOnEnter으로 설정하는 것입니다.하지만 이는 3 회가 아니라 2 회 클릭 만하면된다는 것을 의미합니다.

고유 한 열 유형을 작성해야합니다.

누구나 완료 한 사람은 here입니다.

예제가 위아래로 처리되는지 확인하지 않았습니다. SelectionStart 및 SelectionLength 속성을 사용하여 올바른 트랙에 있지 않은 경우 떠나고있는 셀의 캐럿 위치를 잡아서 적용하십시오. 새로운 세포에. (나는 이미 MaskedTextBox에 사용자 정의 열 유형 내가 이런 짓을 마지막으로 사용하던 가능성이 있기 때문에)


는 이러한 속성을 설정하면 내가 기억하는 조금 더 복잡 것으로 나타났다.

아래 코드는 (vb.Net에 대한 원칙은 vb.Net을 유지하며 사용자가 직접 변환 할 수없는 경우 vb 코드를 제공 할 수 있음) 행복하게 작동합니다. 사용자 정의 컨트롤에 넣음으로써 정돈 될 수 있지만 '은 운동으로 떠날 것이다 :

먼저 나는 EditingControlShowing 이벤트에 대한 처리기를 추가 : current_control 위의 방법에서

void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
{ 
    DataGridViewTextBoxEditingControl t = e.Control as DataGridViewTextBoxEditingControl; 
    current_control = t; 
    t.Leave += new EventHandler(t_Leave); 
} 

는 양식 수준 전용 변수입니다.t 이벤트 처리기는 다음과 같습니다.

void t_Leave(object sender, EventArgs e) 
{ 
    cell_caret_pos = current_control.SelectionStart; 
} 

여기에도 클래스 수준의 private-cell_caret_pos가 있습니다.

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e) 
{ 
    dataGridView1.BeginEdit(false); 
    DataGridViewTextBoxEditingControl editControl = 
     (DataGridViewTextBoxEditingControl)dataGridView1.EditingControl; 

    if (cell_caret_pos != 0) 
    { 
     editControl.SelectionStart = cell_caret_pos; 
     editControl.SelectionLength = 0; 
    } 
} 
+0

우수 답변이 주 비트를 않습니다, 나는이 검색되었다 연령대 : 나는 당신이 CellEnter 이벤트 핸들러 내에서 작동 할 필요가 지정한 selectionStart 및 SelectionLength 설정했다 발견 그리고 무엇

. 그것은 위로 조금을하지 않는다, 그러나 나는 그것을 고칠 수 있을지도 모르다. 이전 셀을 가져 오는 것에 대한 아이디어. –

+0

편집 콘트롤 (편집 컨트롤 표시에서)을 폼 수준의 개인 변수에 놓은 다음 편집 컨트롤 휴가 이벤트 중에 SelectionStart 값을 폼 수준의 int 변수에 배치하여 매우 빠르게 개념화했음을 증명했습니다. 그런 다음 그리드 바깥 쪽에서 int를 확인한 다음 마지막 편집 컨트롤 위치를가집니다. 테스트 할 때 잠시만 기다렸으므로 비슷한 예제를 하위 클래스 dgv에 넣을 수 있어야합니다. –

+0

데이비드 감사합니다. 데이비드에게 캐럿 위치가 있지만 위/아래 화살표를 사용하면 다음 행의 편집 모드로 전환되지 않습니다. 편집을 설정하고 캐럿 위치를 변경하는 방법을 모르겠습니다. 편집 모드를 EditOnEnter로 설정하려고했으나 마우스 클릭 한 번으로 편집 할 수 없습니다. 죄송합니다. 새내기의 비트 ... –