2017-12-17 9 views
0
<DataGrid x:Name="gridView" HorizontalAlignment="Left" Height="263" Margin="10,10,0,0" VerticalAlignment="Top" Width="235" AutoGeneratingColumn="gridView_AutoGeneratingColumn" GotFocus="gridView_GotFocus"> 
     <DataGrid.Columns> 
      <DataGridCheckBoxColumn Binding="{Binding IsChecked, UpdateSourceTrigger=PropertyChanged}"/> 
     </DataGrid.Columns> 
    </DataGrid> 

//Get count and data of checked parts from gridview 
      foreach (var row in gridView.ItemsSource) 
      { 
       bool IsChecked = (bool)((CheckBox)gridView.Columns[0].GetCellContent(row)).IsChecked; 

       if (IsChecked) 
       { 
        var part = ((TextBlock)gridView.Columns[1].GetCellContent(row)).Text; 
        var code = ((TextBlock)gridView.Columns[2].GetCellContent(row)).Text; 
        var um = ((TextBlock)gridView.Columns[3].GetCellContent(row)).Text; 
        addToPartList(part, code, um); 
        checkCount += 1; 
       } 
      } 

이 코드의 목적은 사용자가 확인한 모든 행에서 행 데이터를 수집하는 것입니다. Datagrid의 데이터 소스는 격자에 추가 된 확인란 열이있는 목록입니다. 문제는 그리드가 스크롤 막대가 필요 충분할만큼 큰 경우 가시적 인 그리드 외부의 행은 bool 유형으로 변환 될 때 null 참조 예외를 반환한다는 것입니다. 이 문제를 어떻게 해결할 수 있습니까?DataGrid 행이 눈금에서 보이지 않을 때 Null 참조 예외가 발생하지 않도록하려면 어떻게해야합니까?

+0

왜 Null 체크를 사용하지 않습니까? – Sievajet

답변

0
   if (((CheckBox)gridView.Columns[0].GetCellContent(row)).IsChecked != null) 
       { 

        bool IsChecked = (bool)((CheckBox)gridView.Columns[0].GetCellContent(row)).IsChecked; 

        if (IsChecked) 
        { 
         var part = ((TextBlock)gridView.Columns[1].GetCellContent(row)).Text; 
         var code = ((TextBlock)gridView.Columns[2].GetCellContent(row)).Text; 
         var um = ((TextBlock)gridView.Columns[3].GetCellContent(row)).Text; 
         addToPartList(part, code, um); 
         checkCount += 1; 
        } 
       } 

@Sievajet이 제안했듯이 변환하기 전에 null에 대한 확인을 추가하고 문제를 해결했습니다. 이것은 더 이상 null 참조 예외를 throw하지 않습니다.

0

답이 아니라 단순한 우월함입니다. 이 경우 두 가지를 피할 수 있습니다.

if ((CheckBox)gridView.Columns[0].GetCellContent(row)).IsChecked??false) 
{ 
    var part = ((TextBlock)gridView.Columns[1].GetCellContent(row)).Text; 
    var code = ((TextBlock)gridView.Columns[2].GetCellContent(row)).Text; 
    var um = ((TextBlock)gridView.Columns[3].GetCellContent(row)).Text; 
    addToPartList(part, code, um); 
    checkCount += 1; 
} 

다른 곳에서는 IsChecked 변수를 원하지 않는 한.