16

レコードに特定のフラグが関連付けられているかどうかを示すために、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です...

ヌル画像を含むDataGridView

また、それは.NET 3.5でなければならないので、.NET 4.0だけに解決策があるとしたら、私は運が悪い。

4

3 に答える 3

34

私はこれを理解しました...

列をDataGridViewImageColumnとしてキャストしてから、その列のDefaultCellStyle.NullValueをnullに設定する必要があります。上記の私の例から、あなたはこのようにそれをするでしょう...

((DataGridViewImageColumn)this.emptyDataGridViewFromDesigner.Columns["Flags"]).DefaultCellStyle.NullValue = null;

私はここで尋ねて銃を飛び越えたと思いますが、これがいつか他の誰かに役立つことを願っています。

于 2012-08-02T17:20:28.313 に答える
4

new Bitmap(1,1);セルの.Valueプロパティに割り当てて先に進む方がはるかに簡単です。変更した場合でも、セルの値にNULLを割り当てようとすると、アプリが例外をスローしていました。DefaultCellStyle.NullValue

このようなものは、面倒なことや難解な/あいまいな設定なしで、毎回意図したとおりに機能します。

dataGridView1.Rows[index].Cells["CellName"].Value = isFlag ? Properties.Resources.FlagImage : new Bitmap(1,1);
于 2019-06-26T00:15:28.230 に答える
3

グリッド全体を修正するには、このコードをフォームコンストラクターに追加するだけです。(そしてdataGridの名前を変更します):

        Load += delegate
        {
            // remove default [x] image for data DataGridViewImageColumn columns
            foreach (var column in dataGridView1.Columns)
            {
                if (column is DataGridViewImageColumn)
                    (column as DataGridViewImageColumn).DefaultCellStyle.NullValue = null;
            }
        };
于 2013-03-15T04:40:49.797 に答える