Подтвердить что ты не робот

Как отключить изображение Null в столбце изображения DataGridView при заполнении из DataTable

У меня есть существующее приложение с новым требованием, чтобы показать изображение в ячейке DataGridView, чтобы указать, связан ли с ним определенный флаг (не редактируемый пользователем, это происходит из БД).

Если есть флаг, я показываю соответствующее изображение, и если нет флага, я не хочу, чтобы в столбце ничего не отображалось.

Столбец DataGridView не был создан в дизайнере Visual Studio, иначе это было бы легко. Я мог бы просто установить свойство NullValue в столбце. Вместо этого столбцы создаются во время выполнения, когда все данные загружаются в DataTable, а затем DataView создается из этого DataTable, а затем DataGridView Datasource устанавливается в DataView.

Я не могу полностью переписать это, иначе я бы просто определил столбцы в VS Designer, а не этот смешной способ просто указать столбцы из DataTable.

Мой вопрос в том, как я могу это сделать, чтобы столбец с изображениями ничего не показывал, когда таблица базовых данных имеет нуль?

Вот несколько псевдо С#, чтобы продемонстрировать, что я имею в виду. Помните, я не писал это, чтобы использовать два 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?

EDIT: вот скриншот, чтобы вы могли видеть, что я имею в виду под маленькой коробкой с X - это все нули...

DataGridView with Null Images

Кроме того, он должен быть .NET 3.5, поэтому, если есть решение только в .NET 4.0, мне не повезло.

4b9b3361

Ответ 1

Я понял это...

Присвоить колонку как DataGridViewImageColumn, а затем установить значение DefaultCellStyle.NullValue для этого столбца равным null. Из моего примера выше вы сделаете это так...

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

Я предполагаю, что я прыгнул с пистолета, спрашивая здесь, но надеюсь, что это когда-нибудь поможет кому-то другому.

Ответ 2

Чтобы исправить всю сетку, просто добавьте этот код в конструктор формы. (и измените имя вашего 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;
            }
        };

Ответ 3

Гораздо проще просто назначить new Bitmap(1,1); в ячейку. .Value свойства и двигаться дальше. Мое приложение выдавало исключения всякий раз, когда я пытался присвоить NULL значение ячейки, даже с измененным DefaultCellStyle.NullValue

Примерно так работает, как задумано, каждый раз, без каких-либо хлопот или тайных/неясных настроек:

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