DataGridViewTextBoxCell.ReadOnly = true, но все еще может изменить выбранное значение

DataGridViewComboBoxCell.ReadOnly = true, но все еще может изменить выбранный value имеет тот же вопрос, но пользователь был удовлетворен ответом, который я не могу реализовать.

Я получил dataGridView со многими столбцами, один из которых — checkBoxColumn, который должен активировать или деактивировать другой столбец с текстом:

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

Теперь код, который я получил, отлично работает после загрузки dataGridView: я нажимаю на флажки, и они работают, как и ожидалось.

Проблема в том, что я хочу, чтобы dataGridView отключал ячейки AllergiesDescription, для которых во время загрузки не была проверена соответствующая ячейка Allergies. Я написал код, который должен перебирать строки и выполнять код отключения ячейки всякий раз, когда обнаруживается непроверенная ячейка Allergies. Но вопреки всему, это не работает! Он устанавливает все необходимые свойства для ячейки (например, readonly = true), но ячейка по-прежнему доступна для редактирования:

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

Делюсь своим кодом здесь ниже:

    private void dataGridView_CellContentClick(object sender,
        DataGridViewCellEventArgs cellEvent)
    {
        if (cellEvent.ColumnIndex == AllergiesCheckBoxColumn.Index)
            toggleAllergiesDescriptionHabilitation(cellEvent.RowIndex);
    }

    private void toggleAllergiesDescriptionHabilitation(int rowIndex)
    {
        int columnIndex = AllergiesDescriptionTextBoxColumn.Index;
        DataGridViewRow row = dataGridView.Rows[rowIndex];
        var allergiesDescriptionCell = (DataGridViewTextBoxCell)row.Cells[columnIndex];
        var currentCell = (DataGridViewCheckBoxCell)dataGridView.CurrentCell;
        if ((bool)currentCell.EditedFormattedValue)
            enableCell(allergiesDescriptionCell);
        else
            disableCell(allergiesDescriptionCell);
    }

    private void enableCell(DataGridViewTextBoxCell cell)
    {
        cell.ReadOnly = false;
        cell.Style.BackColor = Color.White;
        cell.Style.ForeColor = Color.Black;
        cell.Style.SelectionBackColor = Color.Blue;
        cell.Style.SelectionForeColor = Color.White;
    }

    private void disableCell(DataGridViewTextBoxCell cell)
    {
        cell.ReadOnly = true;
        cell.Style.BackColor = Color.LightGray;
        cell.Style.ForeColor = Color.DarkGray;
        cell.Style.SelectionBackColor = Color.LightGray;
        cell.Style.SelectionForeColor = Color.DarkGray;
    }

Этот код работает идеально, как я уже сказал, всякий раз, когда я устанавливаю флажок Allergies, соответствующая ячейка AllergiesDescription включает или отключает, как и ожидалось. Но:

    public People(PersistenceManager persistenceManager)
    {
        InitializeComponent();
        //other stuff
        disableNotCheckedAllergiesDescription();
    }

    private void disableNotCheckedAllergiesDescription()
    {
        foreach (DataGridViewRow row in dataGridView.Rows)
        {
            Person person = (Person)row.DataBoundItem;
            if (person != null && !person.Allergies)
                disableNotCheckedAllergiesDescription(row);
        }
    }

    private void disableNotCheckedAllergiesDescription(DataGridViewRow row)
    {
        int columnIndex = AllergiesDescriptionTextBoxColumn.Index;
        var allergiesDescriptionCell = (DataGridViewTextBoxCell)row.Cells[columnIndex];
        disableCell(allergiesDescriptionCell);
    }

Это не работает, как вы можете видеть, он только выполняет код disableCell для каждой ячейки, которая должна быть отключена, когда я отлаживаю, непроверенные строки правильно вводят метод disableCell, и их значение только для чтения правильно установлено в true, но они по-прежнему доступны для редактирования.


person Loaderon    schedule 27.01.2018    source источник
comment
Обходной путь также поможет   -  person Loaderon    schedule 27.01.2018
comment
Попробуйте вызвать disableNotCheckedAllergiesDescription(); не в конструкторе, а в событии загрузки или показа.   -  person LarsTech    schedule 27.01.2018
comment
Ты гений! Я вызвал disableNotCheckedAllergiesDescription() внутри события dataGridView DataBindingComplete, что, очевидно, означает, что я отключил ячейку до того, как произошла привязка данных. Спасибо чувак! опубликуйте свой ответ, и я выберу его.   -  person Loaderon    schedule 27.01.2018


Ответы (1)


Установка свойства ReadOnly для DataGridViewCells кажется слишком ранней, когда вы вызываете ее из конструктора. Попробуйте переместить этот вызов:

disableNotCheckedAllergiesDescription();

вместо этого к событию DataBindingComplete.

private void dgv_DataBindingComplete(object sender, 
                                     DataGridViewBindingCompleteEventArgs e) {
  disableNotCheckedAllergiesDescription();
}
person LarsTech    schedule 27.01.2018