Как проверить, проверен ли DataGridViewCheckBoxCell

Я привязал таблицу данных к DataGridView, в этой таблице данных есть столбец с именем «Статус», который имеет тип Boolean. Я могу установить значение true или false с помощью кода.

Однако я не могу понять, как проверить, проверена ли данная строка уже или нет. Это код, который я пытаюсь использовать, и его компиляция показывает ошибку «указанное приведение недействительно».

Любая помощь будет оценена по достоинству.

if (rowIndex >= 0)
{
    var cbxCell = (DataGridViewCheckBoxCell)dgvScan.Rows[rowIndex].Cells["Status"];

    if ((bool)cbxCell.Value)
    {
        // Do stuff
    }
    else
    {
        // Do other stuff
    }
}

person Community    schedule 13.10.2009    source источник
comment
В вашем примере кода есть два приведения. Какой из них вызывает ошибку? Приведение ячейки к DataGridViewCheckBoxCell или приведение значения к логическому значению?   -  person Jason Berkan    schedule 14.10.2009
comment
Возможно, это не совсем связано с этим вопросом, но это может помочь: stackoverflow.com/a/48465766/5750078   -  person Loaderon    schedule 26.01.2018


Ответы (5)


Проблема в том, что значение FALSE по умолчанию для DataGridCheckBoxColumn равно null, а значение TRUE по умолчанию — это логическое значение True. Это вызывает проблему, поскольку логические значения не могут принимать значения NULL. Вы можете решить эту проблему двумя способами:

    if (cbxCell.Value != null && (bool)cbxCell.Value)
    {
        do stuff;
    }

Другой способ решить эту проблему — установить для свойства TrueValue столбца какое-либо значение. Это можно сделать во время разработки, как показано ниже:

введите здесь описание изображения

Затем вы можете написать:

    if ((string)cbxCell.Value == "T")
    {
        do stuff;
    }

Это работает, потому что строки допускают значение NULL.

Обратите внимание: хотя я установил для FalseValue значение F, значение false по-прежнему кажется нулевым, поэтому я предлагаю игнорировать свойство FalseValue.

Еще одно замечание: ЕСЛИ вы помещаете что-то в TrueValue, как указано выше, а затем пытаетесь стереть его, значение True становится нулевым (ой), требуя, чтобы вы удалили столбец, а затем повторно добавили его, чтобы восстановить его до состояния по умолчанию. Или вы можете изменить его в коде следующим образом:

((DataGridViewCheckBoxColumn)DataGridView1.Columns["Selected"]).TrueValue = true
person Mark Ainsworth    schedule 07.01.2014
comment
это выглядит немного странно, но true.Equals(cbxCell.Value) подходит для null, DBNull.Value и логического значения по умолчанию true. - person Slai; 26.11.2016

Спасибо вам всем. Была та же проблема, но я обнаружил, что запись senderGrid.EndEdit() перед проверкой значения разрешает ее.

private void dgvRiscos_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        var senderGrid = (DataGridView)sender;
        senderGrid.EndEdit();

        if (senderGrid.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn &&
            e.RowIndex >= 0)
        {

            var cbxCell = (DataGridViewCheckBoxCell)senderGrid.Rows[e.RowIndex].Cells["associado"];
            if ((bool)cbxCell.Value)
            {
                   // Criar registo na base de dados
            }
            else
            {
                   // Remover registo da base de dados
            }
        }
    }

Продолжайте хорошую работу

person Lafuente    schedule 06.10.2016
comment
Если бы я мог голосовать бесконечное количество раз, я бы сделал это для этого ответа, я боролся с этой проблемой, но ваш ответ сделал это. Сверхмассивный респект! - person 3bdalla; 08.08.2017

Еще одна проблема, с которой можно столкнуться, заключается в следующем:

Когда пользователь щелкает ячейку, чтобы установить или снять флажок, базовое значение не будет изменено до тех пор, пока ячейка не потеряет фокус.

Это не будет проблемой, если рассматриваемый код находится на кнопке, поскольку ячейка потеряет фокус при нажатии кнопки. Но если ваш код срабатывает по таймеру, вы все еще можете проверять «старое» значение.

См. мой другой ответ здесь: https://stackoverflow.com/a/22080846/1015072

person Allen    schedule 27.02.2014

У меня нет опыта в этом, но я думаю, вам следует проверить значение столбца или свойства.

Попробуйте взглянуть на этот пример:

http://programmingwithstyle.blogspot.com/2007/06/how-to-get-from-datagridviewcheckboxcel.html

person Roberto Aloi    schedule 13.10.2009

CbxCell.Value должно быть равно DBNull.Value (ваш столбец может содержать нулевые значения, верно?)

Я бы проверил DBNull перед кастингом:

if (!DBNull.Value.Equals(CbxCell.Value) && (bool)CbxCell.Value == true)
{
    //Do stuff
}
else
{
    //Do Stuff
}
person manji    schedule 13.10.2009