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

时间:2015-08-10 13:25:28

标签: c# winforms datagridview

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

代码是:

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

它看起来像这样:

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:3)

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

  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;
    
  3.     // 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 colored DataGridViewComboBoxCell examples