none
Не работает код связанный с DataGridViewCheckBoxCell RRS feed

  • Вопрос

  • Здравствуйте!

    Подскажите, почему не работает данный код:

    List<string>  attachments = new List<string>();
    foreach (DataGridViewRow row in dgvFilter.Rows)
    {
           //Если строка помечена, то считать фильтр и создать из выгруженных файлов список
           DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells["chk"];
           if (chk.Value == chk.TrueValue)
                attachments.Add(reportExportToXls(row.Cells["filterWhereDataGridViewTextBoxColumn"].Value.ToString(), tbDir.Text));
    }
    А вот этот вариант работает отлично:
    List<string>  attachments = new List<string>();
    foreach (DataGridViewRow row in dgvFilter.Rows)
    {
           //Если строка помечена, то считать фильтр и создать из выгруженных файлов список
           DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells["chk"];
           if (chk.Value != chk.FalseValue && chk.Value != null)
                attachments.Add(reportExportToXls(row.Cells["filterWhereDataGridViewTextBoxColumn"].Value.ToString(), tbDir.Text));
    }


    30 декабря 2015 г. 6:12

Ответы

  • Как я уже вам сказал, попробуйте выполнить явное приведение типов:

    DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells["chk"];
    bool value = false;
    if (chk.Value is bool)
    {
        value = (bool)chk.Value;
    }
    bool? trueValue = null;
    if (chk.TrueValue is bool)
    {
        trueValue = (bool)trueValue;
    }
    if (value == trueValue)
    {
    
    }
    Как то так...

    30 декабря 2015 г. 7:52
    Отвечающий

Все ответы

  • Добрый день.

    Поставьте точку останова на условии и посмотрите через Watch или наведением мышки на поля, что у вас храниться в Value. Вполне возможно, что у вас разные типы, да и boxing/unboxing сказывается. Попробуйте привести значение к реальному типу.

    30 декабря 2015 г. 7:08
    Отвечающий
  • Спасибо за информацию. Отладку я делал, в Value может храниться как true/false, так и null. 

    я уже ставил брекпоинты где только можно. Сначала я нашёл косяк и он тоже был не мой. Когда в конструкторе для столбца DataGridViewCheckBoxCell задаёшь значения TrueValue = true и FalseValue = false, то Strudio формирует код в дизайнере, как: TrueValue = "true", FalseValue = "false". То есть как строковые константы, а не как булевы. Это я заметил во время отладки. Я исправил руками в дизайнере. Но теперь получается, что когда в условии if (true == true) то выполнение программы не переходит на строку:
    attachments.Add(reportExportToXls(row.Cells["filterWhereDataGridViewTextBoxColumn"].Value.ToString(), tbDir.Text));

    а когда в if (true !=false && true !=null) то код работает правильно

    30 декабря 2015 г. 7:41
  • Как я уже вам сказал, попробуйте выполнить явное приведение типов:

    DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells["chk"];
    bool value = false;
    if (chk.Value is bool)
    {
        value = (bool)chk.Value;
    }
    bool? trueValue = null;
    if (chk.TrueValue is bool)
    {
        trueValue = (bool)trueValue;
    }
    if (value == trueValue)
    {
    
    }
    Как то так...

    30 декабря 2015 г. 7:52
    Отвечающий