次の方法を使用して作成された行の違いを理解しようとしています。
newTable.Rows.Add(array);
newTable.ImportRow(row);
これらの両方のメソッドを使用してDataTableに行を追加するWinFormsアプリがあります。そのDataTableをDataGridViewのデータソースとして使用すると、両方のメソッドを使用して作成されたすべての行を確認できます。ただし、このタイプのループを使用する場合
foreach (DataRow row in newTable.Rows)
{
//...do work
}
ループは、ImportRowメソッドを使用して作成された行のみを「認識」します。Rows.Add(array)を使用して作成された行は存在しないかのようですが、DataTableをデータソースとして使用するとDataGridViewで表示できるため、明らかに存在します。
編集(Rahil Jan Muhammadによるコメントに続く)
はい-たくさん遊んだ後、行追加メソッドはそれとは何の関係もないと思います。問題は次のコードにあります:
foreach (DataGridViewColumn col in dataAllocations.Columns)
{
if (col.Name == "Allocation")
{
col.ReadOnly = false;
}
else
{
col.ReadOnly = true;
}
}
foreach (DataGridViewRow row in dataAllocations.Rows)
{
MessageBox.Show("DataGrid, " + row.Cells["AllocID"].Value.ToString() +
", " + row.Cells["Active"].Value.ToString());
if (row.Cells["Active"].Value == null || (bool)row.Cells["Active"].Value == false)
{
row.ReadOnly = true;
}
else
{
row.ReadOnly = false;
}
}
最初のループでは、列「割り当て」を除くすべての列が読み取り専用になります。2番目のループは、列「アクティブ」の値がfalseの場合に、列「割り当て」を読み取り専用にすることを目的としています。しかし、起こっていることは正反対です。Activeがtrueである行は読み取り専用であり、その逆も同様です。そうです、私の「if」ステートメントに何か問題があります。しかし、何ですか?