允许用户单击DataGridViewImageCell但不更改现有的行选择

时间:2017-08-08 09:24:45

标签: c# winforms datagridview

我有以下DataGridView前两列是DataGridViewImageCell

enter image description here

我想知道的是,我希望用户能够点击第一个单元格(带加号)并运行它的点击方法,但不能更改当前选定的行。

如果点击第二列,没有点击事件没有选择更改,我就不希望发生任何事情。

目前,我刚刚点击了CellContentClick点击事件。

private void dgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    try
    {
        DataGridViewEx dgvGeometryAudit = (DataGridViewEx)sender;
        //Test for first column name IMAGE_TOGGLE
        if (dgvGeometryAudit.Columns[e.ColumnIndex].Name.Equals("IMAGE_TOGGLE", StringComparison.OrdinalIgnoreCase))
        {
            ASSET_HEADER ah = (ASSET_HEADER)dgvGeometryAudit.Rows[e.RowIndex].DataBoundItem;

            ExpandRow(dgvGeometryAudit, ah, e.RowIndex);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Exception: " + ex.Message);
        this.Close();
    }
}

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:1)

创建全局变量private List<int> selectedRows = new List<int>(),然后在cellClick事件内使用:

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex != 0 && e.ColumnIndex != 1)
    {
        if (dataGridView1.Rows[e.RowIndex].Selected == false)
        {
            dataGridView1.Rows[e.RowIndex].Selected = true;
            selectedRows.Add(e.RowIndex);
        }
        else
        {
            dataGridView1.Rows[e.RowIndex].Selected = false;
            selectedRows.Remove(e.RowIndex);
        }
    }
    else
    {
        dataGridView1.ClearSelection();
        //Do your job here for that column/row
        foreach(int r in selectedRows)
        {
            dataGridView1.Rows[r].Selected = true;
        }
    }
}

答案 1 :(得分:0)

这是一个可以防止不必要的选择首先发生的解决方案。您可能希望将其更改为默认为正常选择模式..:

private void dataGridView1_CellMouseMove(object sender, 
                                         DataGridViewCellMouseEventArgs e)
{
    dataGridView1.SelectionMode = e.ColumnIndex == yourImageColumIndex ?
                  DataGridViewSelectionMode.RowHeaderSelect : 
                  DataGridViewSelectionMode.FullRowSelect;    // or whatever you want
}