winforms 单击单元格时选中数据网格视图复选框

t30tvxxf  于 2022-11-17  发布在  其他
关注(0)|答案(5)|浏览(179)

我用 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;
    }

}
bwleehnv

bwleehnv1#

正如Bioukh指出的,必须调用NotifyCurrentCellDirty(true)来触发事件处理程序。但是,添加该行将不再更新选中状态。要完成选中状态的更改 on click,我们将添加对RefreshEdit的调用。这将在单击单元格时切换单元格的选中状态。但是它也会使第一次单击实际的复选框有点麻烦。因此,我们添加如下所示的CellContentClick事件处理程序,您应该可以开始了。
第一个

af7jpaap

af7jpaap2#

这应该可以实现您的目的:

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

bvjxkvbb3#

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();
        }
    }

这些改变对我起作用了!

k2arahey

k2arahey4#

使用HelperClass中的静态函数实现OhBeWise解决方案的更通用方法

public static void DataGrid_CheckBoxCellClick(object sender, DataGridViewCellEventArgs e)
{
    DataGridView dataGrid = sender as DataGridView;
    DataGridViewCheckBoxCell cell = dataGrid?.CurrentCell as DataGridViewCheckBoxCell;

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

在你的代码后面
dataGridView1.CellClick += HelperClass.DataGrid_CheckBoxCellClick;

332nm8kg

332nm8kg5#

不需要以下代码:-)

if(dataGridView.Columns[e.ColumnIndex].ReadOnly != true)

您可以将它写得更简单:

if(!dataGridView.Columns[e.ColumnIndex].ReadOnly)

相关问题