DataGridView透明行选择和双击背景颜色更改

问题描述 投票:0回答:3

以下代码旨在在c#.net中设置DataGridView对象。它将填充对象并将“选定单元格”前/后颜色设置为透明。双击特定行时,如果未设置该行,则应将背景颜色更改为绿色。如果设置了该行,则应将背景颜色更改为白色。

出现两个问题:

1)最初突出显示数据网格的第一行。它不是透明的,而是纯白色的。单击其他行将解决此问题,下一个选定的行将是透明的。

2)执行双击时,数据网格不会将该行的背景更改为新颜色。除非选择另一行,否则它不会改变颜色。

我希望双击操作时背景颜色变化是即时的。

我还希望初始选定的行是透明的。

我的代码可以修复,还是有更好的方法来达到预期的效果。

下面是我的代码的简化摘录。

创建一个c#.net项目,空白表单。

创建DataGridView对象 - 不要通过属性页面设置任何参数。使用以下函数在表单构造函数中调用以设置表:

const int TotalDummyData = 20;

/// <summary>
/// 
/// </summary>
private void CreateDGV()
{
    dgv.Width = 420;
    dgv.Columns.Add("h1", "Name");
    dgv.Columns.Add("h2", "Value");
    dgv.Columns[0].Width = 200;
    dgv.Columns[1].Width = 200;
    dgv.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
    dgv.Columns[1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
    dgv.Columns[0].SortMode = DataGridViewColumnSortMode.NotSortable;
    dgv.Columns[1].SortMode = DataGridViewColumnSortMode.NotSortable;

    for (int i = 0; i < TotalDummyData; i++)
    {
        DataGridViewRow dgvRow = new DataGridViewRow();
        DataGridViewCell dgvCell1 = new DataGridViewTextBoxCell();
        DataGridViewCell dgvCell2 = new DataGridViewTextBoxCell();
        dgvCell1.Value = "dummy_data_name_" + i.ToString();
        dgvCell2.Value = "dummy_data_value_" + i.ToString();
        dgvRow.Cells.Add(dgvCell1);
        dgvRow.Cells.Add(dgvCell2);
        dgv.Rows.Add(dgvRow);
    }
    dgv.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
    dgv.ColumnHeadersDefaultCellStyle.Font = new Font("Arial", 12.0f, FontStyle.Bold);
    dgv.AllowUserToAddRows = false;
    dgv.AllowUserToDeleteRows = false;
    dgv.AllowUserToResizeColumns = false;
    dgv.AllowUserToResizeRows = false;
    dgv.ReadOnly = true;
    dgv.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing;
    dgv.RowHeadersVisible = false;
    dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
    dgv.DefaultCellStyle.SelectionBackColor = Color.Transparent;
    dgv.DefaultCellStyle.SelectionForeColor = Color.Transparent;
    dgv.CellMouseDoubleClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dgv_CellContentDoubleClick);
}

现在创建单元格双击功能 - 这将更改单元格背景颜色

bool[] DummyDataSet = new bool[20];

/// <summary>
/// 
/// </summary>
/// <param name ="sender"></param>
/// <param name ="e"></param>
private void dgv_CellContentDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
{
    if(!DummyDataSet[e.RowIndex])
    {
        DummyDataSet[e.RowIndex] = true;
        dgv.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightGreen;
    }
    else
    {
        DummyDataSet[e.RowIndex] = false;
        dgv.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;
    }
}
c# .net datagridview transparent
3个回答
0
投票

关于为什么它在你点击另一行后改变颜色的答案,问题是你双击一行后它仍然被选中,所以Color.Transparent的datagridview默认选择样式仍然适用,就像我说的那样,它不是真的无论如何,透明度。在事件处理程序中将默认单元格样式backcolor更改为绿色后,添加以下行:dgv.ClearSelection();然后在双击后立即将其着色。

编辑:解决问题1这个问题有点棘手,但是发生这种情况的原因是因为在绘制datagridview时它会将第一行或单元格或列设置为当前选择,具体取决于dgv选择模式。同样,因为您将选择样式设置为Color.Transparent的背面和前面颜色(实际上由于已经讨论过的原因,它实际上最终会变为白色),所以在绘制控件时会选择第一行,这就是为什么你得到全白的原因。遗憾的是,在绘制dgv之前,您无法在CreatedataGridView()方法中清除选择,您需要在绘制控件后清除选择。我通过在Form1()(或形式的Main())方法中添加两行来完成此操作:

public Form1()
    {
        InitializeComponent();
        CreatedataGridView1();

        //Force the form and its children to be drawn...
        this.Show();

        //Now clear the selection
        dataGridView1.ClearSelection();
    }

0
投票

如果您在Windows窗体中工作,我的理解是Windows窗体不支持真正的透明度。换句话说,如果您的数据网格视图后面有图像或某些内容,并且单元格是“透明的”,则它不会显示其后面的图像部分。相反,它从父容器的背景颜色继承其背景颜色。这是我的理解。我不熟悉WPF和透明度,但可能是其他人。此外,在您的双击事件处理程序中,您使用Color.White而不是Color.Transparent(但就像我上面解释的那样,Color.Transparent不是真正的透明度)。

此外,您应该尝试使用事件CellDoubleClick而不是CellContentDoubleClick。否则,用户必须单击单元格以“进入”内容,然后双击内容。


0
投票

我有同样的问题,但我想出了一个更简单的解决方案。只需将单元格的“SelectionBackColor”属性设置为与所需单元格背景颜色相同的颜色,将datagridview的焦点暂时移动到另一个单元格,然后将其设置回所考虑的单元格。这(我相信)允许所有更新和重新涂漆机器正常运行。这是我的双击事件处理程序

       private void dataGridView_Types_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
    {
        DataGridView view = (DataGridView)sender;

        if (view.Columns[e.ColumnIndex].Name == "TypeTable_Color")
        {
            ColorDialog dlg = new ColorDialog();
            DialogResult res = dlg.ShowDialog();
            if (res == DialogResult.OK)
            {
                DataGridViewCell cell = view[e.ColumnIndex, e.RowIndex];
                cell.Style.BackColor = dlg.Color;
                cell.Style.SelectionBackColor = dlg.Color;
                view.CurrentCell = view.FirstDisplayedCell; \\temporarily move focus
                view.CurrentCell = view[e.ColumnIndex, e.RowIndex]; \\put it back - this updates selectionbackcolor
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.