2017-04-17 17 views
0

これはなぜ発生するのですか?DataGridViewCellの値は空ですが、実際には存在します

var tradeList = client.getTradeReports(criteria); 
tradeGridView.DataSource = tradeList; 
int rowCount = tradeGridView.Rows.Count; 

foreach (DataGridViewRow row in tradeGridView.Rows) 
{ 
    for (int counter = 0; counter < columnNameAndFlag.Length; counter++) 
    { 
     if (row.Cells[columnNameAndFlag[counter].Split('-')[0]].Value == null || row.Cells[columnNameAndFlag[counter].Split('-')[0]].Value == DBNull.Value || String.IsNullOrWhiteSpace(row.Cells[columnNameAndFlag[counter].Split('-')[0]].Value.ToString())) 
      tradeData.Add(""); 
     else 
     { 
      if (columnNameAndFlag[counter].Split('-')[0] == "TransactTime") 
       tradeData.Add(dt.AddSeconds(Convert.ToDouble(row.Cells[columnNameAndFlag[counter].Split('-')[0]].Value)).ToLocalTime().ToString()); 
      else 
       tradeData.Add(row.Cells[columnNameAndFlag[counter].Split('-')[0]].Value.ToString()); 
     } 
    } 
} 

foreachループを使用しないと、データグリッドにデータが表示されます。しかし、私はforeachループを使用すると、すべてのセルの値は空/ nullを返します。

の条件を満たし、なぜこれだけの行だ
MessageBox.Show(row.Cells[anyColumn].Value.ToString()); // messagebox shows nothing 

if (row.Cells[columnNameAndFlag[counter].Split('-')[0]].Value == null || row.Cells[columnNameAndFlag[counter].Split('-')[0]].Value == DBNull.Value || String.IsNullOrWhiteSpace(row.Cells[columnNameAndFlag[counter].Split('-')[0]].Value.ToString())) 

EDIT:

これは私が列を作成し、手動でリストとそれぞれの新しいセルの値を設定する方法である:

List<string> tradeData = new List<string>(); 

string columnSettings = ConfigurationManager.AppSettings["columnSettings"]; 
string[] columnNameAndFlag = columnSettings.Split(','); 

var tradeList = client.getTradeReports(criteria); 
tradeGridView.DataSource = tradeList; 
int rowCount = tradeGridView.Rows.Count; 

foreach (DataGridViewRow row in tradeGridView.Rows) 
{ 
    for (int counter = 0; counter < columnNameAndFlag.Length; counter++) 
    { 
     if (row.Cells[columnNameAndFlag[counter].Split('-')[0]].Value == null || row.Cells[columnNameAndFlag[counter].Split('-')[0]].Value == DBNull.Value || String.IsNullOrWhiteSpace(row.Cells[columnNameAndFlag[counter].Split('-')[0]].Value.ToString())) 
      tradeData.Add(""); 
     else 
     { 
      if (columnNameAndFlag[counter].Split('-')[0] == "TransactTime") 
       tradeData.Add(dt.AddSeconds(Convert.ToDouble(row.Cells[columnNameAndFlag[counter].Split('-')[0]].Value)).ToLocalTime().ToString()); 
      else 
       tradeData.Add(row.Cells[columnNameAndFlag[counter].Split('-')[0]].Value.ToString()); 
     } 
    } 
} 

tradeGridView.DataSource = null; 
tradeGridView.Columns.Clear(); 

for (int counter = 0; counter < columnNameAndFlag.Length; counter++) 
{ 
    tradeGridView.Columns.Add(columnNameAndFlag[counter].Split('-')[0], columnNameAndFlag[counter].Split('-')[0]); 

    if (columnNameAndFlag[counter].Split('-').Last() == "1") 
     tradeGridView.Columns[columnNameAndFlag[counter].Split('-')[0]].Visible = true; 
    else 
     tradeGridView.Columns[columnNameAndFlag[counter].Split('-')[0]].Visible = false; 
} 

for (int index = 0; index < rowCount; index++) 
    tradeGridView.Rows.Add(); 

int i = 0; 
foreach (DataGridViewRow row in tradeGridView.Rows) 
{ 
    foreach (DataGridViewCell cell in row.Cells) 
    { 
     cell.Value = tradeData[i]; 
     i++; 
    } 
} 
+0

'counter

+0

@P。 pat yes、カウンタはインクリメント –

+0

あなたは 'foreach'ループをデバッグし、ループするセルの実際の値をチェックすることができます。あなたが投稿したコードは動作するはずです。 – Fabio

答えて

0

あなたはtradeGridView.DataBind()を記述する必要があります。 tradeGridView.DataSource = tradeListの後のコマンド。それが動作しているかどうかを確認してください。

+1

'DataGridView'はWinformコントロールで、' .DataBind'メソッドはありません – Fabio

+0

Ok。 datarowとdatagridviewの行は2つの異なる型であるため、型キャストの例外をスローする必要があります。データグリッドを反復処理する代わりに、入力したデータセットを反復処理することができます。 – mBangali

+0

@mBangali残念ながら、私はそれが鋳造についてではないと確信しています。実際には空のセルがあるのはどういうわけかです。それはそれと同じくらい簡単です。 –

関連する問題