16

我有一个现有应用程序,需要在 DataGridView 单元格中显示图像以表示记录是否具有与之关联的特定标志(用户不可编辑,这来自数据库)。

如果有标志,我会显示相应的图像,如果没有标志,我不想在列中显示任何内容。

DataGridView 列不是在 Visual Studio 设计器中创建的,否则这很容易。我可以在列上设置 NullValue 属性。而是在运行时将所有数据加载到 DataTable 时创建列,然后从该 DataTable 创建 DataView,然后将 DataGridView 的 Datasource 设置为 DataView。

我不能完全重写它,否则我只会在 VS Designer 中定义列,而不是这种荒谬的方式,即让列从 DataTable 中定义。

那么我的问题是,当基础数据表为空时,如何使带有图像的列不显示任何内容?

这是一些伪 C# 来说明我的意思。请记住,我写它不是为了使用这样的两个 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 的小盒子的意思 - 这些都是空的......

具有空图像的 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

要修复整个网格,只需将此代码添加到 Form 构造函数。(并更改您的数据网格的名称):

        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 回答