我创建了一个 DataGridView 对象,其中包含 DataGridViewComboBoxColumn 类型的列,以允许用户从下拉列表中选择值。例如,如果用户选择“高”,我想对组合框的背面进行着色。但是,它不会为组合框着色,而只会为组合框值着色。
代码是:
dgvOverallRisk.Rows[0].Cells[1].Style.ForeColor = Color.Aqua;
dgvOverallRisk.Rows[0].Cells[1].Style.BackColor = Color.Red;
它看起来像这样:
很巧的是,我刚刚在网上回答过类似的问题ForeColor
found here https://stackoverflow.com/a/31885799/3773066。本质上是一样的,你有两个选择:
-
Set the FlatStyle
。但它看起来可能不是你想要的样子。
theComboBoxColumn.FlatStyle = FlatStyle.Flat;
-
这对你来说不是一个准确的解决方案,因为我使用的是 Windows 8.1 和
从你的屏幕截图来看,你使用的是 Windows 7。他们有
不同的显示风格ComboBox
控制,但是这个
应该让你有一个大概的了解一个可能的方向你可以
拿。处理DataGridView.CellPainting
and DataGridView.EditingControlShowing
手动绘制的事件ComboBox
cells.
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);
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)