更改DataGridViewComboBoxColumn的单元格的背景颜色

我使用DataGridViewComboBoxColumn类型的列创建了一个DataGridView对象,以允许用户从下拉列表中选择值。 如果用户选择“高”,我想为combobox的背面着色。 但是,它不会为combobox着色,只会为combobox值着色。

代码是:

dgvOverallRisk.Rows[0].Cells[1].Style.ForeColor = Color.Aqua; dgvOverallRisk.Rows[0].Cells[1].Style.BackColor = Color.Red; 

它看起来像这样:

在此处输入图像描述

在此处输入图像描述

巧合的是,我刚刚在这里找到了关于ForeColor的类似问题。 基本上相同,你有两个选择:

  1. 设置FlatStyle 。 它可能看起来不像你想要的那样。

     theComboBoxColumn.FlatStyle = FlatStyle.Flat; 
  2. 这对你来说不是一个确切的解决方案,因为我在Windows 8.1上并通过你的屏幕截图判断,你在Windows 7上。他们的ComboBox控件有不同的显示风格,但这应该让你对可能的方向有一个大概的了解你可以拿走。 处理DataGridView.CellPaintingDataGridView.EditingControlShowing事件以手动绘制ComboBox单元格。

     this.dataGridView1.CellPainting += this.dataGridView1_CellPainting; this.dataGridView1.EditingControlShowing += this.dataGridView1_EditingControlShowing; this.dataGridView1.Rows[0].Cells[1].Style.ForeColor = Color.DarkRed; this.dataGridView1.Rows[0].Cells[1].Style.BackColor = Color.Bisque; this.dataGridView1.Rows[1].Cells[1].Style.ForeColor = Color.SpringGreen; this.dataGridView1.Rows[1].Cells[1].Style.BackColor = Color.Purple; 
  // Paint the cell when not in edit mode. private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) { if (e.RowIndex >= 0 && e.ColumnIndex >= 0) { if (this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex] is DataGridViewComboBoxCell) { var cell = this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewComboBoxCell; var foreColor = cell.Style.ForeColor.Name == "0" ? Color.Black : cell.Style.ForeColor; e.Paint(e.ClipBounds, DataGridViewPaintParts.Border); e.Paint(e.ClipBounds, DataGridViewPaintParts.ContentBackground); using (Brush forebrush = new SolidBrush(foreColor)) using (Brush backbrush = new SolidBrush(cell.Style.BackColor)) using (StringFormat format = new StringFormat()) { Rectangle rect = new Rectangle(e.CellBounds.X + 1, e.CellBounds.Y + 1, e.CellBounds.Width - 19, e.CellBounds.Height - 3); format.LineAlignment = StringAlignment.Center; e.Graphics.FillRectangle(backbrush, rect); e.Graphics.DrawString(cell.FormattedValue.ToString(), e.CellStyle.Font, forebrush, rect, format); } e.Paint(e.ClipBounds, DataGridViewPaintParts.ErrorIcon); e.Paint(e.ClipBounds, DataGridViewPaintParts.Focus); e.Handled = true; } } } // Paint the cell in edit mode. private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { if (this.dataGridView1.CurrentCellAddress.X == combo.DisplayIndex) { ComboBox cb = e.Control as ComboBox; if (cb != null) { cb.DropDownStyle = ComboBoxStyle.DropDownList; cb.DrawMode = DrawMode.OwnerDrawFixed; cb.DrawItem -= this.cb_DrawItem; cb.DrawItem += this.cb_DrawItem; } } } // Manually paint the combobox. private void cb_DrawItem(object sender, DrawItemEventArgs e) { ComboBox cb = sender as ComboBox; // Non-sourced vs sourced examples. string value = cb.Items[e.Index].ToString(); // string value = (cb.DataSource as DataTable).Rows[e.Index].ItemArray[SourceColumnIndex]; if (e.Index >= 0) { using (Brush forebrush = new SolidBrush(cb.ForeColor)) using (Brush backbrush = new SolidBrush(cb.BackColor)) { e.Graphics.FillRectangle(backbrush, e.Bounds); e.DrawBackground(); e.DrawFocusRectangle(); e.Graphics.DrawString(value, e.Font, forebrush, e.Bounds); } } } 

Back / Fore-ground彩色DataGridViewComboBoxCell示例