winforms 选择当前行的单元格时,datagridview也绘制行

dnph8jn4  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(163)

我有一个代码片段,但它不能很好地工作,为什么?
1 -当启动应用程序时,它正在将所有记录都涂成粉红色,只有当我选择所有已涂的记录时,它才会再次正常工作。
2 -当选择两个或多个单元格,然后只选择其中一个选定单元格时,线条绘制失败。
我希望使用selecionMode = CellSelect和multiSelect = true属性绘制选定单元格的整行,以便在选择一个或多个单元格时绘制相应的行。what i want to happen

private void DataGridView1_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
{
            var dataGrid = (DataGridView)sender; 
            var s = e.StateChanged;// = DataGridViewElementStates.Selected;
            if (e.Cell.RowIndex > -1)
            {
                DataGridViewRow row = dataGrid.Rows[e.Cell.RowIndex];
                if (e.Cell.Selected)
                {
                    row.DefaultCellStyle.BackColor = Color.Pink;
                }
                else if (!e.Cell.Selected)
                {
                    row.DefaultCellStyle.BackColor = Color.White;
                }
            }
}
zrfyljdw

zrfyljdw1#

我知道在加载数据时所有行都被选中,这只是从包含的数据中选择所有行。此时,没有“取消选择”,所以它会绘制所有行。
我用下面的方法解决了这个案子:
在加载数据之前禁用网格:

dataGridView1.Enabled = false;
dataGridView1.DataSource = data;

在线条绘制过程中,我验证网格是否启用,以了解它在加载数据时的状态:

private void dataGridView1_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
    {
        var s = e.StateChanged;// = DataGridViewElementStates.Selected;
        if (e.Cell.RowIndex > -1)
        {
            DataGridViewRow row = ((DataGridView)sender).Rows[e.Cell.RowIndex];
            if ((e.Cell.Selected) && ((DataGridView)sender).Enabled)
            {
                row.DefaultCellStyle.BackColor = Color.Pink;
            }
            else if (!e.Cell.Selected)
            {
                row.DefaultCellStyle.BackColor = Color.White;
            }
        }
    }

最后,我在“dataGridView1_Paint”事件中再次启用网格:

private void dataGridView1_Paint(object sender, PaintEventArgs e)
    {
        dataGridView1.Enabled = true;
    }

一个重要的细节是“Paint”事件一直被调用,使得网格不可能在以后在业务模型中被禁用。如果没有这种可能性,流程将完美地工作。这是我找到的唯一方法。

相关问题