Triggering a checkbox value changed event in DataGridView

前端 未结 15 2775
一生所求
一生所求 2020-12-01 08:02

I have a grid view that has a check box column, and I want to trigger a drawing event as soon as the value of the cell is toggled. I tried the ValueChaged and the CellEndEdi

相关标签:
15条回答
  • 2020-12-01 08:11

    Small update.... Make sure you use EditedFormattedValue instead of value as I tried value but it never give right status that is checked/unchecked most of the site still use value but as used in latest c# 2010 express below is one way to access..

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

    Also _CellValueChanged event suggested or used by few must be usable for some cases but if you are looking for every check/uncheck of cell make sure you use _CellContentClick else per my notice I see not every time _CellValueChanged is fired.. that is if the same checkbox is clicked over & over again it does not fire _CellValueChanged but if you click alternately for example you have two chekbox & click one after other _CellValueChanged event will be fired but usually if looking for event to fire everytime the any cell is check/uncheck _CellValueChanged is not fired.

    0 讨论(0)
  • 2020-12-01 08:11

    cellEndEditTimer.Start();

    this line makes the datagridview update the list of checked boxes

    Thank you.

    0 讨论(0)
  • 2020-12-01 08:13

    Try hooking into the CellContentClick event. The DataGridViewCellEventArgs will have a ColumnIndex and a RowIndex so you can know if a ChecboxCell was in fact clicked. The good thing about this event is that it will only fire if the actual checkbox itself was clicked. If you click on the white area of the cell around the checkbox, it won't fire. This way, you're pretty much guaranteed that the checkbox value was changed when this event fires. You can then call Invalidate() to trigger your drawing event, as well as a call to EndEdit() to trigger the end of the row's editing if you need that.

    0 讨论(0)
  • 2020-12-01 08:13

    Working with an unbound control (ie I manage the content programmatically), without the EndEdit() it only called the CurrentCellDirtyStateChanged once and then never again; but I found that with the EndEdit() CurrentCellDirtyStateChanged was called twice (the second probably caused by the EndEdit() but I didn't check), so I did the following, which worked best for me:

        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;
        }
    
    0 讨论(0)
  • 2020-12-01 08:14

    I had the same issue, but came up with a different solution:

    If you make the column or the whole grid "Read Only" so that when the user clicks the checkbox it doesn't change value.

    Fortunately, the DataGridView.CellClick event is still fired. In my case I do the following in the cellClick event:

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

    But you could check the column name if you have more than one checkbox column.

    I then do all the modification / saving of the dataset myself.

    0 讨论(0)
  • 2020-12-01 08:14

    I found a combination of the first two answers gave me what I needed. I used the CurrentCellDirtyStateChanged event and inspected the 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;
            }
         }
    }
    
    0 讨论(0)
提交回复
热议问题