2014-01-26 4 views
2

IncTbl이라는 DataGridView가 있습니다. 나는 그 위에 반복하고있다, 그리고 나는 yearSalary 변수, 4 열에 인덱스 난을 무엇의 가치를 추가하고 : 나는 NullReferenceException를 얻을 수 있기 때문에,IsNewRow 속성이 항상 false를 반환하는 이유는 무엇입니까?

for (int i = 0; i < IncTbl.Rows.Count; i++) 
{ 
    if (IncTbl.CurrentRow.IsNewRow) break; 
    yearSalary += (decimal)IncTbl[4, i].Value; 
} 

내가 널을 추가하지 않는, 그래서 IsNewRow 속성을 사용하고 있습니다. 그러나 새로운 행 일 때라도 false를 반환합니다. 이 문제를 어떻게 해결할 수 있습니까?

+2

"그것은"귀하의 경우 항상'CurrentRow', _not_ 당신이하고자하는 행 ...'(IncTbl.Rows 경우 [내가 시도입니다 ] .IsNewRow) break; ' – DonBoitnott

답변

2

당신은 이런 종류의 행동을 본 유일한 사람이 아닙니다. IsNewRowthis MSDN post에 버그로보고되었습니다.

Incidentaly break은이 컨텍스트에서 약간 이상합니다. 다음과 같이 루프를 약간 조정할 것을 고려해보십시오.

for (int i = 0; i < IncTbl.Rows.Count; i++) 
     { 
      if (!IncTbl.CurrentRow.IsNewRow) 
       yearSalary += (decimal)IncTbl[4,i].Value; 
     } 
+0

또한, 아래의 pid의 대답에 대해 : IsNewRow의 * semantics *를 알고 계십니까? 버그가 없더라도 DataSet이로드 된 후 UI에서이 행이 사용자에 의해 추가되었음을 의미한다는 것을 알아야합니다. 당신은 이미 그것을 알고있을 것입니다. – jbeldock

+0

"새 레코드 행이 행 모음에 있으므로 IsNewRow 속성을 사용하여 행이 새 레코드 행인지 또는 채워진 행인지 확인합니다. 데이터 입력시 새 행이 중지됩니다. 행이 시작됩니다. " 여기에서 가져온 : http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewrow.isnewrow(v=vs.110).aspx - 분명히 그 물건을 다시 읽어야 :) 어쨌든 고마워! – pid

+0

죄송합니다. PID, 나는 분명히 알았던 당신에게가 아니라 그것을 OP에 지적했습니다. :-) – jbeldock

0

IsNewRow이 잘못되었습니다. 사용자가 새 데이터를 삽입 할 수있는 행에 대해서만 사실입니다. 바운드 행에는 데이터베이스 데이터가 포함됩니다. 즉, 새로운 데이터가 아니라 지속 된 데이터입니다.

NullReferenceException을 피하기 위해 필요한 것은 행 유형을 확인하는 것입니다. 아마도 머리말 행은 물건을 엉망으로 만들고 있습니다 ...

이 도움이되는지 확인하십시오 : RowType.

-1

할 수 있습니다 예를 들어 같은 루프를 :

foreach (DataGridViewRow row in dataGridView1.Rows) 
{ 
    decimal temp; 
    if(!row.IsNewRow && decimal.TryParse(row.Cells[4].Value.ToString(), out temp)) 
     yearSalary += temp; 
} 
관련 문제