2009-06-08 5 views
8

XML 직렬화를 통해 XML 파일을 읽고 쓰는 데 DataGridView 컨트롤을 사용하고 있습니다. DataGridView - 셀에서 선택 항목이 손실되지 않으면 값이 저장되지 않음

  1. 내가 XML 파일을 읽고 직렬화 된 객체 된 DataGridView 컨트롤을 채우는 아래에 설명 된대로

    나는 문제가있다.

  2. 셀의 DataGridView에있는 모든 값을 업데이트합니다.
  3. 마지막 셀에 포커스를 잃지 않고 파일 저장 옵션을 선택합니다.

이 후에는 특정 셀의 값이 업데이트되지 않습니다. 의도적으로 초점을 멀리 이동하면 (예 : 동일한 격자의 다른 셀을 클릭하면) 값이 업데이트됩니다.

누구나이 솔루션을 제안 할 수 있습니까?

답변

4

올바르게 이해하면 셀이 편집 모드에 있으며 프로그래밍 방식으로 편집을 중지하고 기본 데이터 소스에 값을 전달하려고합니까? 내 응용 프로그램 중 하나에 그렇게 다소 "더러운"접근 방식을 사용하고

:

if (dataGridView1.CurrentCell.IsInEditMode)  
{  
    int y = dataGridView1.CurrentCellAddress.Y;  
    int x = dataGridView1.CurrentCellAddress.X;  
    if (y > 0)  
     dataGridView1.CurrentCell = dataGridView1.Rows[y - 1].Cells[x];  
    else  
     dataGridView1.CurrentCell = dataGridView1.Rows[y + 1].Cells[x];  
    dataGridView1.CurrentCell = dataGridView1.Rows[y].Cells[x];  
} 

현재 셀 편집 모드에 있는지 여부를 코드를 먼저 확인의 조각. 그런 다음 현재 셀을 프로그래밍 방식으로 변경합니다 (첫 번째 행에있는 경우 이전 행 또는 다음 행으로). 그런 다음 현재 셀 선택을 복원합니다.

"File Save As"핸들러에서이 코드를 호출 할 수 있습니다.

+0

해답을 제공해 주셔서 감사합니다. –

+0

기꺼이 도와 드리겠습니다. 이것을 당신의 받아 들인 해결책으로 표시 할 수 있습니까? –

15

편집 된 셀 값이 유효성이 검사 될 때까지 (셀이 포커스를 잃을 때 발생) 데이터 소스에 커밋되지 않았기 때문입니다. 즉시 수정 사항을 커밋하려면, 당신은 CurrentCellDirtyStateChanged 이벤트를 처리하고 처리기에서 것은, commitEdit 메서드를 호출 할 수 있습니다 : 당신은 아직 EditedFormattedValue 속성을 사용하여 최선을 다하고 있지 않은 셀의 값을 얻을 수 있습니다

void dataGridView1_CurrentCellDirtyStateChanged(object sender, 
    EventArgs e) 
{ 
    if (dataGridView1.IsCurrentCellDirty) 
    { 
     dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); 
    } 
} 
+1

이것은 굉장히 효과가있었습니다, 감사합니다! –

+2

내 저장 방법에서 완벽하게 작동합니다. 감사!! –

+0

이것은 나에게도 매우 효과적이다. 감사합니다 – Abdullah

0

dataGridView1.CurrentCell.EditedFormattedValue 
16

가장 좋은 방법은 아래와 같이 현재 셀은 (신속하고 더러운하지만) Nothing에 currentCell 값을 할당하는 것입니다.

dgvMyGrid.CurrentCell = Nothing 

을 한 후 더 이상 진행 : 예를 들어

, 저장 방법, 않습니다.

+0

동일한 상황에서 솔루션이 완벽하게 작동했습니다. 나는 아직도 이것이 어떻게 가능한지 궁금해하고있다. – JPReddy

0

나는 같은 상황을 겪었고 그리드 값을 저장하기 위해 세이브 버튼에 단축키를 사용하기까지했다. DGV에서 잃어버린 저장 버튼 포커스를 클릭하면 셀 값이 커밋되지만 액셀러레이터 키를 사용하면 포커스가 DGV에서 손실되지 않으므로 셀 값이 커밋되지 않습니다.

호기심에서 Amit Karmakar 대답을보고 나면 그 대답을 시도했고 효과가있었습니다. 자세한 내용을 찾으려면 DGV 디버깅에 들어갔다가 저장 버튼 클릭에 사용하면 어떻게 든 작동하지 않는 commitedit과 실제로 동일하다는 것을 알았습니다.

DGV의 CurrentCell을 null로 설정하기 전에 null로 설정하기 전에 DGV가 먼저 편집 된 값을 가져 와서 셀 값으로 밀어 넣은 다음 CurrentCell REFERENCE를 null로 설정합니다. 여기에서 기본 DGV 셀을 null로 설정한다는 의미는 아닙니다. 따라서 위의 문제에 대해 완벽하게 작동합니다.

참고 : 셀에 대한 유효성 검사 이벤트가 있고 사용자가 유효하지 않은 유효하지 않은 데이터를 입력하면 유효성 검사를 실패 할 때이 솔루션이 완벽하게 작동하지 않을 수 있습니다. 이 경우 셀에 값을 전달할 수 없기 때문에 현재 셀을 null로 설정하는 작업도 실패합니다.

저는 Amit Karmakar가 어떻게 가능할 수 있는지 묻는 질문에 대해이 설명을했습니다. 다른 도움이 될지도 모른다고 생각 했으므로이 설명을 답으로 버렸습니다.

0

OK,이 추한이지만 다른 행으로 이동하지 않고도 계통에서 최종 변경 사항을 얻기 위해 작동합니다

With DataGridView1 
    .DataSource = Nothing 
    .DataSource = gridDataTable 
    Dim changedFoo As DataTable = gridDataTable.GetChanges 
End With 

그러나 나는 여전히 미트 Karmakar 최선의 대답있다. 'DataGridView1.CurrentCell = Nothing'을 DataGridView1 LostFocus 이벤트에 추가했습니다.

관련 문제