在我的 DGV 中,单击一个单元格后,我想用某个值更改同一列的所有单元格的背景颜色。单击另一个单元格后,前一个单元格(及其所有列)必须恢复默认样式
int currCell = dgvLogHeader.CurrentCell.ColumnIndex;
string pattern = dgvLogHeader.CurrentCell.Value.ToString();
dgvLogHeader.AlternatingRowsDefaultCellStyle.BackColor = SystemColors.ScrollBar;
dgvLogHeader.DefaultCellStyle.BackColor = SystemColors.Info;
for (int j=0; j < dgvLogHeader.Rows.Count; j++ ) {
//dgvLogHeader.Columns[currCell].
if (dgvLogHeader.Rows[j].Cells[currCell].Value.ToString() == pattern) {
dgvLogHeader.Rows[j].Cells[currCell].Style.BackColor = Color.Brown;
}
}
但是之后单元格背景发生了变化,默认样式也丢失了。
这是一种方法:
private void dgvLogHeader_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
foreach (DataGridViewColumn col in dgvLogHeader.Columns)
{
if (col.DefaultCellStyle.BackColor != Color.Empty)
col.DefaultCellStyle.BackColor = Color.Empty;
}
dgvLogHeader.Columns[e.ColumnIndex].DefaultCellStyle.BackColor = Color.Gainsboro;
}
这首先将每列的颜色重置为默认值 (
Color.Empty
),然后为当前列着色。
请注意,这不会重置您在单个单元格中设置的任何颜色!
将您需要设置的重置为
Color.Empty
。
您可能想添加一个
dgvLogHeader.ClearSelection();
清除所单击单元格的选择。
但是:如果您需要根据单元格值单独决定颜色,那么您将必须循环单元格。这最好在
CellPainting
事件中完成,因为它以优化的方式调用以仅包含显示的单元格。请注意,它是在每个单元格的基础上调用的,因此您需要遵守 e.ColumnIndex
和 e.RowIndex
值..
更新:现在您已经澄清了问题,确实您需要循环遍历所有或所有可见单元格..
您可以调用以下函数来执行此操作:
private void markCells(DataGridView dgv, string pattern)
{
dgv.SuspendLayout();
foreach (DataGridViewRow row in dgv.Rows)
foreach (DataGridViewCell cell in row.Cells)
cell.Style.BackColor = cell.Value.ToString() == pattern ?
Color.LightBlue : Color.Empty;
dgv.ResumeLayout();
//dgv.ClearSelection()
}
如果快速遍历整个DGV;你可以这样称呼它来自
Textbox.TextChange
事件。
它在设置颜色时暂停布局,所以它应该很快并且没有闪烁..
如果您只想在一列中搜索,您可以添加额外的条件,也许像这样:
cell.Style.BackColor = cell.Value.ToString() == pattern &&
cell.ColumnIndex == dgv.CurrentCell.ColumnIndex?
并将其放入
CellClick
事件