【问题标题】:DataGridView transparent row selection and double click background colour changeDataGridView透明行选择和双击背景颜色变化
【发布时间】:2014-02-26 17:57:03
【问题描述】:

以下代码旨在在 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


    【解决方案1】:

    关于为什么单击另一行后它会改变颜色的答案,问题是双击一行后它仍然被选中,所以Color.Transparent的datagridview默认选择样式仍然适用,就像我一样说,无论如何,这不是真正的透明度。在事件处理程序中将默认单元格样式背景色更改为绿色后,添加以下行: 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();
        }
    

    【讨论】:

    • 优秀。这解决了问题 2)
    • 谢谢,如果您的所有问题都得到解决,请将此标记为答案:)
    • 我会标记无忧,但还没有,仍然有问题1)要解决 - 在应用程序启动时,初始选择的行不是透明的,而是纯白色(没有可见文本) -在用户进行焦点更改时,此问题会自行解决。
    • 谢谢,我编辑了问题 1 的答案 :)
    【解决方案2】:

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

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

    【讨论】:

    • 我将 SelectionBackColor 设置为透明,并将 BackColor 设置为绿色或白色。然而,这只有在将焦点放在不同的行之后才有效。 CellContentDoubleClick 事件不需要单击然后双击,只需双击即可触发。
    【解决方案3】:

    我也遇到过同样的问题,但我想出了一个我认为更简单的解决方案。只需将单元格的“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
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2015-04-28
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      • 2012-11-05
      • 2012-06-26
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      相关资源
      最近更新 更多