Флажок Datagridview установлен при нажатии на ячейку

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

private void dataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if(dataGridView.Columns[e.ColumnIndex].ReadOnly != true)
    {       
          //option 1
          (dataGridView.CurrentRow.Cells[e.ColumnIndex] as DataGridViewCheckBoxCell).Value = true;
          //option 2
          DataGridViewCheckBoxCell cbc = (dataGridView.CurrentRow.Cells[e.ColumnIndex] as DataGridViewCheckBoxCell);
          cbc.Value = true;
          //option 3
          dataGridView.CurrentCell.Value = true;
    }

}

person Jnr    schedule 01.04.2015    source источник
comment
это XAML? это был бы лучший тег для вопроса, чем [cell] и [checked]   -  person DLeh    schedule 01.04.2015
comment
Почему этот вопрос получил минусовое голосование?   -  person Jnr    schedule 03.04.2015
comment
Понижение связано с тем, что в SO много самоуверенных идиотов, которые думают, что это лучший способ повысить ценность.   -  person Craig.Feied    schedule 04.04.2018
comment
Я согласен, эти идиоты должны скорее дать лучшее решение или, по крайней мере, вескую причину вместе с голосованием за / против, а не быть предвзятыми.   -  person Jnr    schedule 04.04.2018


Ответы (3)


Как указывает Биух, вы должны вызвать NotifyCurrentCellDirty(true), чтобы вызвать обработчик событий. Однако добавление этой строки больше не будет обновлять ваше проверенное состояние. Чтобы завершить изменение состояния проверки при нажатии, мы добавим вызов RefreshEdit. Это будет работать для переключения состояния проверки вашей ячейки при нажатии на ячейку, но это также сделает первый щелчок фактического флажка немного глючным. Итак, мы добавляем обработчик события CellContentClick, как показано ниже, и все должно быть хорошо.


private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
  DataGridViewCheckBoxCell cell = this.dataGridView1.CurrentCell as DataGridViewCheckBoxCell;

  if (cell != null && !cell.ReadOnly)
  {
    cell.Value = cell.Value == null || !((bool)cell.Value);
    this.dataGridView1.RefreshEdit();
    this.dataGridView1.NotifyCurrentCellDirty(true);
  }
}

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
  this.dataGridView1.RefreshEdit();
}
person OhBeWise    schedule 02.04.2015
comment
Спасибо за ответы. Я получаю исключение «указанное приведение недействительно»: (bool)cell.value - person Jnr; 03.04.2015
comment
@Jnr Каково значение ячейки, если не True или False? - person OhBeWise; 03.04.2015
comment
Это хороший вопрос, и я не упомянул, что datagridview привязан к данным. Таким образом, значение равно DBNull. Вместо приведения к bool я использовал dataGridView.CurrentCell.Value = true; Спасибо за помощь! - person Jnr; 04.04.2015
comment
Рад помочь! Хорошая работа, выяснив это исправление. - person OhBeWise; 04.04.2015
comment
Работает отлично. Вы можете избавиться от ячейки. Значение == ноль || так как он гарантированно не будет нулевым в этой строке. - person FoppyOmega; 17.02.2016

Это должно делать то, что вы хотите:

private void dataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if(dataGridView.Columns[e.ColumnIndex].ReadOnly != true)
    {       
        dataGridView.CurrentCell.Value = true;
        dataGridView.NotifyCurrentCellDirty(true);
    }
}
person Bioukh    schedule 02.04.2015

private void dataGridView3_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == dataGridView3.Columns["Select"].Index)//checking for select click
        {
            dataGridView3.CurrentCell.Value = dataGridView3.CurrentCell.FormattedValue.ToString() == "True" ? false : true;
            dataGridView3.RefreshEdit();
        }
    }

Эти изменения сработали для меня!

person amit poddar    schedule 15.11.2016