2017-01-29 12 views
0

列の1つにあるテキストに基づいて、データグリッドビューアの行の色を変更しようとしています。私はエラーを取得しています:最初のifステートメントの行にオブジェクトのインスタンスにオブジェクト参照が設定されていません。私はコードも以下のデータソースに基づいてdatagridviewerを埋めました。列内のテキストに基づいて行の色を変更します。

void ChangeDataGridViewColor() 
    { 
     foreach (DataGridViewRow Row in datagridviewTreatmentPrep.Rows) 
     { 
      if (Row.Cells["Primary Onc"].Value.ToString() == "JMK") 
      { 
       Row.DefaultCellStyle.BackColor = Color.Green; 
      } 

      if (Row.Cells["Primary Onc"].Value.ToString() == "DBF") 
      { 
       Row.DefaultCellStyle.BackColor = Color.Orange; 
      } 

      else 
      { 
       Row.DefaultCellStyle.BackColor = Color.White; 
      } 
     } 

    } 

void FillDataGridViewTreatmentPrep() 
    { 
     string constring = "datasource = RadOncViewerDatabase.db"; 

     string TreatPrepQuery = "SELECT * FROM TreatmentPrep"; 

     SQLiteConnection connectionstring = new SQLiteConnection(constring); 

     connectionstring.Open(); 

     DataTable dsTreatPrep = new DataTable(); 
     SQLiteDataAdapter adapterTreatPrep = new SQLiteDataAdapter(TreatPrepQuery, constring); 
     adapterTreatPrep.Fill(dsTreatPrep); 

     datagridviewTreatmentPrep.DataSource = dsTreatPrep;      

     //datagridviewTreatmentPrep.BindingContext = new BindingContext(); 
     //this.datagridviewTreatmentPrep.DataSource = dsTreatPrep.Tables[0].DefaultView.ToTable(true, "Patient_Name"); 

    } 
+0

あなたは 'Row.Cells [ "プライマリONC"]よろしいです[値]がnullではありませんか。?あなたは行が存在することを知っています...しかし、その価値はないかもしれません。 – JohnG

+0

はい。列名の値はPrimary Oncです。私は、混乱は、データセットでデータグリッドビューアを塗りつぶしたこと、そしてカラムを適切に参照していないという事実にあります。 – LitteringAnd

+0

コードをステップ実行し、 'Primary Onc'と呼ばれる列がない場合、' dsTreatPrep'にどの列名が含まれているかを確認します。 – JohnG

答えて

2

RowPrePaintイベントを使用し、nullにできるオブジェクトに.ToString()を使用しないでください。

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) 
{ 
    if (e.RowIndex < 0) return; 
    var row = (sender as DataGridView).Rows[e.RowIndex]; 
    string value = Convert.ToString(row.Cells["Primary Onc"].Value); 
    //or in VS 2015: string value = row.Cells["Primary Onc"].Value?.ToString(); 

    if (value == "JMK") 
     row.DefaultCellStyle.BackColor = Color.Green; 
    else if (value == "DBF") 
     row.DefaultCellStyle.BackColor = Color.Orange; 
    else 
     row.DefaultCellStyle.BackColor = Color.White; 
} 
+0

ありがとう!これは実際に動作します! @ JohnGが提案したようなforeach DataGridRowViewを使用するように変更する必要がありました。 – LitteringAnd

+0

@ Litteringそして、表示されている行ごとに呼び出されるため、RowPrePaintイベントでループを使用しないことを願っています。 – Slai

+0

それがなければ、インデックスが範囲外であるためにコードがエラーをスローするからです。このエラーは、var行行で発生します。私はそれは、datagridviewは最初にdatatableに基づいているため、インデックスには何もないからだと思います。ちょうど推測。 – LitteringAnd

0

あなたはDataGridViewCellStyleクラス を使用する必要があります私の解決策:

 int max = dgv.Rows.Count; 
DataGridViewCellStyle style; 
      for (int i = 0; i < max; i++) 

       for (int j = 2; j < dgv.Columns.Count; j++) 

        if (dgv[j, i].Value.ToString() == "") 
        { 
         style = dgv[j, i].Style; 
         style.BackColor = Color.Red; 
         dgv[j, i].Style = style; 
        } 
1

以下は、私がテストしたコードであると期待どおりに動作します。遅れて申し訳ありません。

foreach (DataGridViewRow Row in dataGridView1.Rows) { 
    DataRowView drv = (DataRowView)Row.DataBoundItem; 
    if (drv != null) { 
    if (drv.Row["Primary Onc"].ToString() == "JMK") { 
     Row.DefaultCellStyle.BackColor = Color.Green; 
    } 
    else { 
     if (drv.Row["Primary Onc"].ToString() == "DBF") { 
     Row.DefaultCellStyle.BackColor = Color.Orange; 
     } 
     else { 
     Row.DefaultCellStyle.BackColor = Color.White; 
     } 
    } 
    } 
} 

これが役立ちます。

+0

ありがとう@JohnG。あなたがしたことは私には意味がありますが、 'DataRowViewにはセルの定義が含まれていません。 – LitteringAnd

+0

問題を引き起こしていた行を変更しました。申し訳ありませんが、現時点では自分のコンピュータにアクセスできません。 – JohnG

+0

@ Litteringそして私はこれをテストすることができ、期待通りに動作します。 – JohnG

関連する問題