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, но они по-прежнему доступны для редактирования.
disableNotCheckedAllergiesDescription();
не в конструкторе, а в событии загрузки или показа. - person LarsTech   schedule 27.01.2018