レコードに特定のフラグが関連付けられているかどうかを示すために、DataGridViewセルに画像を表示するという新しい要件を持つ既存のアプリケーションがあります(ユーザーが編集できない、これはDBから取得されます)。
フラグがある場合は対応する画像を表示し、フラグがない場合は列に何も表示しないようにします。
DataGridView列はVisualStudioデザイナーで作成されていません。そうでない場合、これは簡単です。列にNullValueプロパティを設定するだけで済みます。代わりに、実行時にすべてのデータがDataTableに読み込まれるときに列が作成され、そのDataTableからDataViewが作成され、DataGridViewのDatasourceがDataViewに設定されます。
これを完全に書き直すことはできません。さもないと、DataTableから列を定義させるというばかげた方法ではなく、VSDesignerで列を定義するだけです。
私の質問は、基になるデータテーブルにnullがある場合に、Imagesの列に何も表示されないようにするにはどうすればよいですか?
これが私が何を意味するかを示すためのいくつかの疑似C#です。このように2つのDataTableを使用するように作成したのではないことを忘れないでください。渡されたときはそうだったので、新しい列を追加するためだけに大幅な変更を加えたくはありません...
DataTable rawData = someMethodThatReturnsMyRawData();
DataTable data = new DataTable();
data.Columns.Add("Flags", typeof(Image));
data.Columns.Add("SomeOtherColumn");
foreach (DataRow rawDataRow in rawData.Rows)
{
DataRow dataRow = data.NewRow();
bool hasFlagType1 = false;
bool hasFlagType2 = false;
if (rawDataRow["FlagType1ID"] != DBNull.Value)
{
hasFlagType1 = true;
}
if (rawDataRow["FlagType2ID"] != DBNull.Value)
{
hasFlagType2 = true;
}
if (hasFlagType1 && hasFlagType2)
{
dataRow[0] = Properties.Resources.BothFlagsImage;
}
else if (hasFlagType1)
{
dataRow[0] = Properties.Resources.FlagType1Image;
}
else if (hasFlagType2)
{
dataRow[0] = Properties.Resources.FlagType2Image;
}
else
{
//If neither flag set, I don't want it to show anything,
//but if I leave it as null, a little box with an X in it shows up
//I could set it to some transparent GIF here, but that seems lame
}
dataRow[1] = rawDataRow["SomeOtherColumn"];
data.Rows.Add(dataRow);
}
DataView dv = new DataView(data, string.Empty, "SomeOtherColumn ASC", DataViewRowState.CurrentRows);
this.emptyDataGridViewFromDesigner.DataSource = dv;
// How can I modify the column "Flags" at this point to show nothing if the value is null?
編集:これはスクリーンショットですので、Xが付いた小さなボックスの意味を確認できます-これらはすべてnullです...
また、それは.NET 3.5でなければならないので、.NET 4.0だけに解決策があるとしたら、私は運が悪い。