2014-02-07 2 views
2

Я нашел несколько сообщений с ответами на это, но ни один из них не работает для меня. Почему что-то должно быть так просто так сложно?Слушайте флажок

Все, что я хочу, это сделать что-то в ответ на то, что кто-то проверяет/снимает флажок с флажками. Одно решение работает большую часть времени, но иногда события не запускаются. Один я видел в нескольких местах говорят что-то вроде этого:

private void dgv1_CurrentCellDirtyStateChanged(object sender, EventArgs e) { 
     if (dgv1.IsCurrentCellDirty) { 
      dgv1.CommitEdit(DataGridViewDataErrorContexts.Commit); 
     } 
} 
private void dgv1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { 
    // Do whatever I want to do. 
} 

К сожалению, CellValueChanged просто не вызывалась. я проверил и дважды проверил, что оба слушатели добавляют:

dgv1.CellValueChanged += new DataGridViewCellEventHandler(dgv1_CellValueChanged); 
dgv1.CurrentCellDirtyStateChanged += new EventHandler(dgv1_CurrentCellDirtyStateChanged); 

я добавил печати заявления в обоих methodsto проверить, что метод theCellValueChanged никогда не вызывался, хотя CurrentCellDirtyStateChanged один. Что я делаю не так?

Редактировать: Я использую DataTable с данным DataGridView. Будет ли я лучше слушать это? Происходит ли изменение в DataTable до того, как я покину ячейку?

+0

Простота проверки или снятия флажка не вызывает события CellValueChanged. Я думаю, что этот флажок сначала должен потерять фокус. Вы можете взглянуть на детали в MSDN http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.cellvaluechanged.aspx –

+0

@David Это причина события CurrentCellDirtyStateChanged - см. [http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.currentcelldirtystatechanged.aspx](http://msdn.microsoft.com/en-us/library/system.windows .forms.datagridview.currentcelldirtystatechanged.aspx) – ferzle

ответ

1

Дайте ему попробовать. Но на этот раз в CellContentClick события.

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 
{ 
    switch (e.ColumnIndex) 
    { 
     case 0: //Where the DataGridViewCheckBoxColumn Index 
      dataGridView1[e.ColumnIndex, e.RowIndex].Value = 
       !(bool) dataGridView1[e.ColumnIndex, e.RowIndex].Value; 
      if ((bool)dataGridView1[e.ColumnIndex, e.RowIndex].Value) 
      { 
       //Something to do 
      } 
      break; 
    } 
} 

Опция: Вы можете установить DataGridViewCheckBoxColumn свойства readonly = true.

+0

Часть readonly не является обязательной. Если readonly == false, он работает примерно в 90% случаев. Примерно в 10% случаев событие не регистрируется, даже если значение изменяется. Я заметил, что это происходит при снятии флажка, но не может подтвердить, что это не происходит при проверке. С readonly == true это кажется надежным. Это имеет смысл, потому что значение может меняться только тогда, когда этот код выполняется, поэтому он либо запускает событие, либо меняет его, либо нет, и он не изменяется. Это немного неуклюже (если вы щелкаете дважды слишком быстро, второй клик не регистрируется), но он работает. – ferzle

+0

Чтобы это выяснить, это решение работает само по себе - БЕЗ других слушателей. И 'ReadOnly' должен быть установлен как true, чтобы он был на 100% надежным. – ferzle

+0

Я рад, что это немного помогает, вы можете «отменить» мой ответ, а затем:: ' – spajce

0

Моя рабочая реализация также использует этот подход, но это немного отличается:

private void table_CurrentCellDirtyStateChanged(object sender, EventArgs e) 
{ 
    // Because I want to respond immediately to the user changing the state of one of the "excluded" cells, 
    // I have to detect the dirty state of such a cell changing, then call CommitEdit() in order to explicitly 
    // cause the CellValueChanged() event to be raised. 

    if (_table.CurrentCellAddress.X == _colExcluded.DisplayIndex) 
    { 
     _table.CommitEdit(DataGridViewDataErrorContexts.Commit); 
    } 
} 

В этом случае _colExcluded.DisplayIndex случается, как я могу проверить, правильно ли столбец был быть нажат.

Отличие от вашего кода в том, что я не проверяю, загрязнена ли текущая ячейка перед вызовом CommitEdit(). Я думаю, что это может быть проблемой.

+0

Я вынул весь код, пытаясь определить, является ли он правильным столбцом. Я буду иметь дело с этим, как только я смогу заставить слушателей фактически работать вообще. Что касается вызова CommitEdit, каждый пример, который я видел, кажется, вызывает его в объекте DataGridView. – ferzle

+0

@ferzle Yep, '_table' в моем коде - это объект DataGridView. Я удалил свой комментарий об этом, когда понял, что это то же самое, что вы делали. –

Смежные вопросы