从DataTable填充时,如何在DataGridView图像列中禁用Null图像

时间:2012-08-02 16:45:33

标签: c# .net winforms image datagridview

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

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

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

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

我的问题是,当基础数据表为空时,我怎样才能使图像的列显示什么?

这里有一些伪C#来证明我的意思。记住,我没有写它来使用这样的两个DataTables;当我把它递给我时,就是这样,我不想为了添加一个新的列而做出重大改变......

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 with Null Images

此外,它必须是.NET 3.5,所以如果只有.NET 4.0中的解决方案,我运气不好。

3 个答案:

答案 0 :(得分:30)

我想出来了......

必须将列强制转换为DataGridViewImageColumn,然后将该列的DefaultCellStyle.NullValue设置为null。从上面的例子中,你可以这样做......

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

我想我在这里问了一下枪,但是希望这有时可以帮助别人。

答案 1 :(得分:3)

要修复整个网格,只需将此代码添加到Form构造函数即可。 (并更改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;
            }
        };

答案 2 :(得分:1)

简单地将new Bitmap(1,1);分配给单元格的.Value属性并继续进行,这很容易实现。每当我尝试为单元格的值分配NULL时,即使使用修改后的DefaultCellStyle.NullValue

,我的应用程序都会引发异常

每次这样的事情都会按预期工作,而不会造成任何麻烦或奥秘/晦涩的设置:

dataGridView1.Rows[index].Cells["CellName"].Value = isFlag ? Properties.Resources.FlagImage : new Bitmap(1,1);