Winforms datagridviewbuttoncell限制鼠标悬停和单击事件以更改按钮的背景颜色

cczfrluj  于 2023-11-21  发布在  其他
关注(0)|答案(1)|浏览(138)

我创建了一个带有按钮列的dgv,想在单击时更改按钮单元格的颜色(让我们说从绿色到红色)。然而,当我将鼠标指针悬停在一个单元格上时,它会将其背景颜色更改为透明(匹配bg颜色的网格),并点击它改变它的颜色为第三个。按钮的flatstyle设置为flat,所有DefaultGridStyle颜色的选项都设置为绿色。2如何防止按钮单元格的颜色在鼠标悬停和单击时改变颜色?
我尝试重新定义CellMouseEnter和CellMouseDown事件:

private void dgv_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
   dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor;
}

private void dgv_CellMouseEnter(object sender, DataGridViewCellEventArgs e)
{
    dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor;
}

字符串
但是,拾取不同的颜色会更改单元格的边框颜色,而背景颜色保持透明。

jogvjijk

jogvjijk1#

您的代码(以及它下面的附加注解)表明您希望在CellMouseDown上更改颜色。似乎阻止这种情况发生的原因是单元格在“单击的那一刻”变为选中。因此,如果您不 * 也 * 更改cell.Style.SelectionBackColor,那么它可能不会按照您希望的方式运行。当我测试它时,这个小小的改变似乎使它像你描述的那样工作。


的数据
在这里,当鼠标进入按下状态时,此方法不仅设置cell.Style.SelectionBackColor,还将其稍微清洗以获得一些视觉反馈。

private void onCellMouseDown(object? sender, DataGridViewCellMouseEventArgs e)
{
    if(dataGridView.Columns[nameof(Color)].Index == e.ColumnIndex &&  e.RowIndex != -1)
    {
        Color newColor;
        var cell = dataGridView[e.ColumnIndex, e.RowIndex];
        switch (cell.Style.BackColor.Name) 
        {
            case nameof(Color.LightGreen): newColor = Color.LightSalmon; break;
            case nameof(Color.LightSalmon): newColor = Color.LightBlue; break;
            case nameof(Color.LightBlue):
            default:
                newColor = Color.LightGreen;
                break;

        }
        Recordset[e.RowIndex].Color = 
            cell.Style.BackColor = newColor;

        const int OFFSET = 40;
        cell.Style.SelectionBackColor =
            Color.FromArgb(
                Math.Min(255, newColor.R + OFFSET),
                Math.Min(255, newColor.G + OFFSET),
                Math.Min(255, newColor.B + OFFSET)
        );
        dataGridView.Refresh();
    }
}

字符串
当鼠标重新抬起时,拉动真实的Style.BackColor并将其转移到Style.SelectionBackColor

private void onCellMouseUp(object? sender, DataGridViewCellMouseEventArgs e)
{
    if (dataGridView.Columns[nameof(Color)].Index == e.ColumnIndex && e.RowIndex != -1)
    {
        var cell = dataGridView[e.ColumnIndex, e.RowIndex];

        cell.Style.SelectionBackColor =
            cell.Style.BackColor;
        dataGridView.Refresh();
    }
}


我应该提到,我将此列设置为ReadOnly,因为多次单击鼠标将进入Edit模式,否则您可能会遇到新的问题。

相关问题