Подтвердить что ты не робот

Запуск события изменения флажка в DataGridView

У меня есть представление сетки, которое имеет столбец флажка, и я хочу вызвать событие рисования, как только будет изменено значение ячейки. Я попробовал ValueChaged и CellEndEdit и BeginEdit и выбрал режим выбора как CellSelect. Что касается первых двух событий, событие было инициировано после завершения режима редактирования, например, перемещения из текущей ячейки или перехода назад и вперед. Это просто странное поведение.

Есть ли что-нибудь, что вызывает событие на экране сетки, как только изменяется значение ячейки?

С наилучшими пожеланиями,

4b9b3361

Ответ 2

Я использую событие CellContentClick, которое позволяет пользователю щелкнуть флажок. Он срабатывает многократно, даже если пользователь остается в одной ячейке. Одна проблема заключается в том, что значение не обновляется и всегда возвращает "false" для unchecked. Хитрость заключается в использовании свойства .EditedFormattedValue ячейки вместо свойства Value. EditedFormattedValue будет отслеживать с помощью галочки и это то, что нужно, чтобы Value имел в нем, когда CellContentClick запущен.

Нет необходимости в таймере, нет необходимости в каких-либо причудливых вещах, просто используйте событие CellContentClick и ознакомьтесь с EditedFormattedValue, чтобы узнать, в каком состоянии находится флажок. Если EditedFormattedValue = true, флажок устанавливается.

Ответ 3

Другой способ - обработать событие CellContentClick (которое не дает вам текущего значения в свойстве Cell Value), вызовите grid.CommitEdit(DataGridViewDataErrorContexts.Commit), чтобы обновить значение, которое в свою очередь будет активировать CellValueChanged, где вы можете затем получите фактическое (то есть правильное) значение DataGridViewCheckBoxColumn.

private void grid_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
   grid.CommitEdit(DataGridViewDataErrorContexts.Commit);
}

private void grid_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    // do something with grid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value
}

Целевая платформа .NET: 2.0

Ответ 4

Попробуйте подключиться к событию CellContentClick. DataGridViewCellEventArgs будет иметь ColumnIndex и RowIndex, чтобы вы могли узнать, действительно ли был установлен ChecboxCell. Хорошая вещь об этом событии состоит в том, что он будет срабатывать только при нажатии на фактический флажок. Если вы щелкнете по белой области ячейки вокруг флажка, она не будет срабатывать. Таким образом, вы почти гарантированно, что значение флажка было изменено, когда это событие срабатывает. Затем вы можете вызвать Invalidate(), чтобы вызвать событие рисования, а также вызов EndEdit(), чтобы вызвать окончание редактирования строки, если вам это нужно.

Ответ 5

Я, наконец, реализовал его таким образом

  private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    {

        if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
        {
            if (dataGridView1[e.ColumnIndex, e.RowIndex].GetContentBounds(e.RowIndex).Contains(e.Location))
            {
                cellEndEditTimer.Start();
            }
        }

    }

    private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    { /*place your code here*/}


    private void cellEndEditTimer_Tick(object sender, EventArgs e)
    {
        dataGridView1.EndEdit();
        cellEndEditTimer.Stop();
    }

Ответ 6

У меня была такая же проблема, но придумал другое решение:

Если вы сделаете столбец или всю сетку "Только для чтения", чтобы при щелчке пользователем этого флажка он не менял значение.

К счастью, событие DataGridView.CellClick все еще запущено. В моем случае я делаю следующее в событии cellClick:

if (jM_jobTasksDataGridView.Columns[e.ColumnIndex].CellType.Name == "DataGridViewCheckBoxCell")

Но вы можете проверить имя столбца, если у вас более одного столбца флажка.

Затем я делаю все изменения/сохранение набора данных самостоятельно.

Ответ 7

Небольшое обновление.... Убедитесь, что вы используете EditedFormattedValue вместо value, как я пробовал value, но он никогда не дает правильного статуса, который отмечен или не отмечен. Большая часть сайта все еще использует value, но как используется в последнем выпуске С# 2010 ниже приведен один из способов доступа..

grdJobDetails.Rows[e.RowIndex].Cells[0].EditedFormattedValue

Кроме того, событие _CellValueChanged, предлагаемое или используемое несколькими, должно использоваться для некоторых случаев, но если вы ищете каждую проверку/снятие ячейки, убедитесь, что используете _CellContentClick else в моем уведомлении, я вижу не каждый раз _CellValueChanged (если это тот же самый флажок снова и снова нажимается, он не срабатывает _CellValueChanged, но если вы нажмете поочередно, например, у вас есть два chekbox и нажмите один за другим после того, как событие _CellValueChanged будет запущено, но обычно при поиске для случая, когда огонь срабатывает каждый раз, когда какая-либо ячейка проверяет/снимает флажок _CellValueChanged не запускается.

Ответ 8

cellEndEditTimer.Start();

эта строка делает обновление datagridview в списке отмеченных ящиков

Спасибо.

Ответ 9

Событие "РедактированиеСогласование" не срабатывает при изменении значения флажка. Поскольку стиль отображения ячейки флажка не изменяется.

Обходной путь, который я использовал, приведен ниже. (Я использовал событие CellContentClick)

    private void gGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        if (string.Compare(gGridView1.CurrentCell.OwningColumn.Name, "CheckBoxColumn") == 0)
        {
            bool checkBoxStatus = Convert.ToBoolean(gGridView1.CurrentCell.EditedFormattedValue);
            //checkBoxStatus gives you whether checkbox cell value of selected row for the
            //"CheckBoxColumn" column value is checked or not. 
            if(checkBoxStatus)
            {
                //write your code
            }
            else
            {
               //write your code
            }
        }
    }

Вышеизложенное сработало для меня. Пожалуйста, дайте мне знать, если вам нужна дополнительная помощь.

Ответ 10

Я нашел простое решение.

Просто измените фокус ячейки после нажатия на ячейку.

private void DGV_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == "Here checkbox column id or name") {
        DGV.Item(e.ColumnIndex, e.RowIndex + 1).Selected = true;
        //Here your code

    }
}

Не забудьте проверить, существует ли столбец вашего индекса (ckeckbox + 1).

Ответ 11

Я нашел комбинацию первых двух ответов, дал мне то, что мне было нужно. Я использовал событие CurrentCellDirtyStateChanged и проверил EditedFormattedValue.

private void dgv_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
   DataGridView dgv = (DataGridView)sender;
   DataGridViewCell cell = dgv.CurrentCell;
   if (cell.RowIndex >= 0 && cell.ColumnIndex == 3) // My checkbox column
     {
        // If checkbox checked, copy value from col 1 to col 2
        if (dgv.Rows[cell.RowIndex].Cells[cell.ColumnIndex].EditedFormattedValue != null && dgv.Rows[cell.RowIndex].Cells[cell.ColumnIndex].EditedFormattedValue.Equals(true))
        {
           dgv.Rows[cell.RowIndex].Cells[1].Value = dgv.Rows[cell.RowIndex].Cells[2].Value;
        }
     }
}

Ответ 12

Используйте этот код, если вы хотите использовать событие checkedChanged в представлении DataGrid:

private void grdBill_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    grdBill.CurrentCell =  grdBill.Rows[grdBill.CurrentRow.Index].Cells["gBillNumber"];
}

private void grdBill_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    calcBill();
}

private void calcBill()
{
    listBox1.Items.Clear();
    for (int i = 0; i < grdBill.Rows.Count - 1; i++)
    {
        if (Convert.ToBoolean(grdBill.Rows[i].Cells["gCheck"].Value) == true)
        {
            listBox1.Items.Add(grdBill.Rows[i].Cells["gBillNumber"].Value.ToString());
        }
    }
}

Здесь grdBill = DataGridView1, gCheck = CheckBox in GridView(First Column), gBillNumber = TextBox в гриде (второй столбец).

Итак, когда мы хотим запустить checkchanged событие для каждого клика, сначала сделайте CellContentClick, он загорится, когда пользователь щелкнет текстовое поле, затем он переместит текущую ячейку в следующий столбец, чтобы столбец CellEndEdit загорелся, он проверит, установлен ли флажок, и добавьте "gBillNumber" в поле списка (в функции calcBill).

Ответ 13

Работа с несвязанным элементом управления (т.е. я управляю содержимым программно), без EndEdit() он только один раз называется CurrentCellDirtyStateChanged, а затем никогда больше; но я обнаружил, что с EndEdit() CurrentCellDirtyStateChanged был вызван дважды (второй, вероятно, вызван EndEdit(), но я не проверял), поэтому я сделал следующее, которое наилучшим образом помогло мне:

    bool myGridView_DoCheck = false;
    private void myGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
    {
        if (!myGridView_DoCheck)
        {
            myGridView_DoCheck = true;
            myGridView.EndEdit();
            // do something here
        }
        else
            myGridView_DoCheck = false;
    }