none
DataGridView событие для Checkbox RRS feed

  • Вопрос

  • Есть датаГридВию, в нем есть колонка с типом CheckBox, какое событие отвечает когда происходит изменения значения(есть галка, нет галки)?

    гуглил, но находил примеры которые только костылями и назовешь, неужели нет, что то проще в стиле C#?


    • Изменено Magals 12 февраля 2013 г. 8:12
    12 февраля 2013 г. 8:12

Ответы

  • Перехватите событие CellValuechanged в качестве аргумента туда передается экземпляр DataGridViewCellEventArgs

    private void DataGridView1_CellValueChanged(
        object sender, DataGridViewCellEventArgs e)
    {
    if (e.ColumnIndex == colnum)
    {
     var row = dataGridView1
            .Rows[e.RowIndex];
    if ((bool)row.Cells[e.ColumnIndex])
    {
    //add to array
    }
    else
    {
    remove from array
    }
    }
    }
       
    }

    columnum индекс вашей колонки в которой стоит чекбокс

    • Помечено в качестве ответа Magals 12 февраля 2013 г. 11:22
    12 февраля 2013 г. 10:40
  • ((DataGridViewCheckBoxCell)row.Cells[e.columnIndex]).Value

    • Изменено Brash_O 12 февраля 2013 г. 10:53
    • Помечено в качестве ответа Magals 12 февраля 2013 г. 11:22
    12 февраля 2013 г. 10:51

Все ответы

  • Поймать клик на контроле можно при помощь CellContentClick, если ва мнужно само значение то это надо смотреть в коллекции записей
    12 февраля 2013 г. 8:26
  • Почему бы вам просто не посмотреть в сторону события CurrentCellDirtyStateChanged мне кажется оно вам полностью подойдет.

    [Блог] [Twitter]

    12 февраля 2013 г. 8:30
  • Поймать клик на контроле можно при помощь CellContentClick, если ва мнужно само значение то это надо смотреть в коллекции записей

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
                if (dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[0].Value.ToString() != "true")
                {
                    dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[0].Value = true;
                    Text = "true";
                }
                else
                {
                    dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[0].Value = false;
                    Text = "false";
                }
            }

    попытался написать свой обработчик, но всегда выполняется условия проверки. где я ошибся?
    12 февраля 2013 г. 8:51
  • Это событие вызывается когда вы кликаете на ячейке, и значение в этот момент еще не измененно, если вам нужно что бы обрабатывался только клик на нужной колонке, то проверяйте что ColumnIndex == вашей колонке, сейчас вы проверяете при клике на любой колонке, а если вам нужно уже новое значение то ловите событие CellValueChanges.CellValueChanged event to respond to it." id="mt69">

    12 февраля 2013 г. 9:01
  • Это событие вызывается когда вы кликаете на ячейке, и значение в этот момент еще не измененно, если вам нужно что бы обрабатывался только клик на нужной колонке, то проверяйте что ColumnIndex == вашей колонке, сейчас вы проверяете при клике на любой колонке, а если вам нужно уже новое значение то ловите событие CellValueChanges.CellValueChanged event to respond to it." id="mt69">


    Нужно не сам клик обрабатывать, а узнать в какое состояние перешло свойство ЧекБокса. то есть если сравнивать с обычным ЧекБоксом, то необходимо событие 

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
            {
            }

    со свойством Checked;

    Если говорить о конечной цели, то вот что имею сейчас:

    когда должен нажать на ЧекБокс, то в динамический массив я добавляю данные со всей строки, когда снимаю галку, я удаляю из массива данные этой строки

    12 февраля 2013 г. 10:30
  • Перехватите событие CellValuechanged в качестве аргумента туда передается экземпляр DataGridViewCellEventArgs

    private void DataGridView1_CellValueChanged(
        object sender, DataGridViewCellEventArgs e)
    {
    if (e.ColumnIndex == colnum)
    {
     var row = dataGridView1
            .Rows[e.RowIndex];
    if ((bool)row.Cells[e.ColumnIndex])
    {
    //add to array
    }
    else
    {
    remove from array
    }
    }
    }
       
    }

    columnum индекс вашей колонки в которой стоит чекбокс

    • Помечено в качестве ответа Magals 12 февраля 2013 г. 11:22
    12 февраля 2013 г. 10:40
  • Перехватите событие CellValuechanged в качестве аргумента туда передается экземпляр DataGridViewCellEventArgs

    private void DataGridView1_CellValueChanged(
        object sender, DataGridViewCellEventArgs e)
    {
    if (e.ColumnIndex == colnum)
    {
     var row = dataGridView1
            .Rows[e.RowIndex];
    if ((bool)row.Cells[e.ColumnIndex])
    {
    //add to array
    }
    else
    {
    remove from array
    }
    }
    }
       
    }

    columnum индекс вашей колонки в которой стоит чекбокс

    Ошибка 1 Преобразование типа "System.Windows.Forms.DataGridViewCell" в "bool" невозможно 
    12 февраля 2013 г. 10:48
  • ((DataGridViewCheckBoxCell)row.Cells[e.columnIndex]).Value

    • Изменено Brash_O 12 февраля 2013 г. 10:53
    • Помечено в качестве ответа Magals 12 февраля 2013 г. 11:22
    12 февраля 2013 г. 10:51
  • ((DataGridViewCheckBoxCell)row.Cells[e.columnIndex]).Value


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



    хотя нет, всё идет нормально
    • Помечено в качестве ответа Magals 12 февраля 2013 г. 11:22
    • Снята пометка об ответе Magals 12 февраля 2013 г. 11:22
    • Изменено Magals 12 февраля 2013 г. 12:19
    12 февраля 2013 г. 11:21
  • Просто сделай событие на закрытие формы, только так получилось побороть...

    privatevoidFrmBase_FormClosing(objectsender, FormClosingEventArgse)

    {

    dgvQuest[1,0].Selected = true;

    }

    3 марта 2016 г. 3:12
  • Как перехватить событие изменения этого Value интерактивно, не программно а по щелчку. Визуально состояние (крыж) меняется, но Click происходит до этого. А после этого нашел только CellEndEdit, но как сказано "смущает только одно, событие происходит когда переключаюсь на другую колонку".  Нет способа поймать сам момент изменения состояния по щелчку?



    • Изменено ashaxm 5 апреля 2017 г. 12:22
    5 апреля 2017 г. 11:16
  • О, нашел такой способ:

    включил в Sub MailDataGridView_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles MailDataGridView.CellClick

    принудительную установку/снятие крыжа и сразу зависящие от этого действия там же.

    5 апреля 2017 г. 15:56