2017-12-17 10 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

なぜヌルチェックを使用しないのですか? – 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参照例外がスローされることはなくなりました。

0

答えはありませんが、ちょっとした説明です。 これで2つは回避できます。

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変数を別の場所に設定しない限り、

関連する問題