DataGridView透明行选择和双击背景颜色更改
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataGridView透明行选择和双击背景颜色更改相关的知识,希望对你有一定的参考价值。
以下代码旨在在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;
}
}
关于为什么它在你点击另一行后改变颜色的答案,问题是你双击一行后它仍然被选中,所以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();
}
如果您在Windows窗体中工作,我的理解是Windows窗体不支持真正的透明度。换句话说,如果您的数据网格视图后面有图像或某些内容,并且单元格是“透明的”,则它不会显示其后面的图像部分。相反,它从父容器的背景颜色继承其背景颜色。这是我的理解。我不熟悉WPF和透明度,但可能是其他人。此外,在您的双击事件处理程序中,您使用Color.White
而不是Color.Transparent
(但就像我上面解释的那样,Color.Transparent
不是真正的透明度)。
此外,您应该尝试使用事件CellDoubleClick
而不是CellContentDoubleClick
。否则,用户必须单击单元格以“进入”内容,然后双击内容。
我有同样的问题,但我想出了一个更简单的解决方案。只需将单元格的“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
}
}
}
以上是关于DataGridView透明行选择和双击背景颜色更改的主要内容,如果未能解决你的问题,请参考以下文章
网页制作中,我使用滤镜,把背景颜色黑色半透明了,但它也把我黑色背景上的字体也给半透明了,求高手指...