2012-06-27 2 views
0

모두 내가 원했던 것은 간단합니다 (또는 그렇게 생각했습니다). 현재 사용자가 처리해야하는지 여부를 나타내는 확인란이있는 DataGridView이 있습니다. 내가 Certian 조건에서 Check DataGridView CheckBox를 사용하십시오.

private void dataGridViewProcess_CellContentClick(object sender, DataGridViewCellEventArgs e) 
{ 
    if (e.ColumnIndex == (int)ProcessColumns.Error) 
    { 
     if (!String.IsNullOrEmpty(dataGridViewProcess.Rows[e.RowIndex] 
            .Cells[e.ColumnIndex].Value.ToString())) 
     { 
      Utils.ErrMsg(String.Format("{0}", 
       (String.IsNullOrEmpty(siteReportArr[currentSite, e.RowIndex]) ? 
       "Error message currently unavalible. Try again later." : 
       siteReportArr[currentSite, e.RowIndex]))); 
     } 
    } 
    dataGridViewProcess.CommitEdit(DataGridViewDataErrorContexts.Commit); 
} 

private void dataGridViewProcess_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
{ 
    if (!bInLoadEvent && e.RowIndex >= 0) 
    { 
     if (e.RowIndex == (int)CurrentProcess.N) 
     { 
      DataGridViewRow rowA = dataGridViewProcess.Rows[e.RowIndex]; 
      DataGridViewRow rowB = dataGridViewProcess.Rows[e.RowIndex + 1]; 
      if (Convert.ToBoolean(rowA.Cells[(int)ProcessColumns.Process].Value) 
       == false) 
      {  
       rowB.Cells[(int)ProcessColumns.Process].Value = false; 
      } 
     } 
     ... 
     else if (e.RowIndex == (int)CurrentProcess.C) 
     { 
      DataGridViewRow rowB = dataGridViewProcess.Rows[e.RowIndex]; 
      DataGridViewRow rowA = dataGridViewProcess.Rows[e.RowIndex - 1]; 
      if (Convert.ToBoolean(rowA.Cells[(int)ProcessColumns.Process].Value) 
       == true) 
      { 
       rowB.Cells[(int)ProcessColumns.Process].Value = true; 
      } 
     } 
    } 
} 

이들의 프로그램에 모든 변경

를 사용하여 체크 의존 프로세스를 강제 있도록 일부 공정은 미세 바 하나 인 dataGridViewProcess_CellValueChanged 이벤트에 표시된 마지막 하나의 일을 다른 사람에 의존하고 있습니다. 여기에 C 이전의 프로세스가 선택되어 있고 사용자가 C의 선택을 취소하려고 시도하는 경우이를 강제로 확인하고 싶습니다. 나는 현재이 일을 할 수 없습니다.

나는 DataGridViewValidated 이벤트를 사용하고 CellDirtyStateChanged 이벤트를 사용하지 않으려 고 시도했습니다. 이 (겉으로보기에는 아주 기본적인) 문제에 대한 도움이 가장 감사 할 것입니다.

감사합니다.

답변

2

문제점은 이벤트 처리 체인에 문제가 있다고 생각합니다. 귀하의 코드를 복사하고 조금 수정했습니다. 핵심은 마지막 조건이 현재 편집중인 셀을 수정하는 유일한 조건 일 가능성이 높다는 것입니다. 코드가 예상대로 실행되지만 체크 박스가 변경되지 않는 경우 - 체크 박스가 포커스를 잃을 때까지 올바른 값으로 변경됩니다. 나는 그것이 당신은 것은, commitEdit 실제 편집을 종료하지 않는 MSDN here에주의 할 것이다

dataGridViewProcess.EndEdit(); 

dataGridViewProcess.CommitEdit(DataGridViewDataErrorContexts.Commit); 

에서 dataGridViewProcess_CellContentClick에 다음 줄을 변경하여 작업을 얻었다.

+0

+1 도움을 주셔서 대단히 감사합니다. 매우 감사드립니다. 나는 오늘 그 밑에있다, 너의 시간을 위해 다시 고마워 ... – MoonKnight

관련 문제