我想在使用DrawItem事件的DataGridView中的ComboBoxCell中繪製項目。以下是我的代碼。在ComboBoxCell中自定義繪製項目
更新的代碼:
private void dgv_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
int index = dgv.CurrentCell.ColumnIndex;
if (index == FormatColumnIndex)
{
var combobox = e.Control as ComboBox;
if (combobox == null)
return;
combobox.DrawMode = DrawMode.OwnerDrawFixed;
combobox.DrawItem -= combobox_DrawItem;
combobox.DrawItem += new DrawItemEventHandler(combobox_DrawItem);
}
}
void combobox_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index < 0)
{
return;
}
int index = dgv.CurrentCell.RowIndex;
if (index == e.Index)
{
DataGridViewComboBoxCell cmbcell = (DataGridViewComboBoxCell)dgv.CurrentRow.Cells["ProductFormat"];
string productID = dgv.Rows[cmbcell.RowIndex].Cells["ProductID"].Value.ToString();
string item = cmbcell.Items[e.Index].ToString();
if (item != null)
{
Font font = new System.Drawing.Font(FontFamily.GenericSansSerif, 8);
Brush backgroundColor;
Brush textColor;
if (e.State == DrawItemState.Selected)
{
backgroundColor = SystemBrushes.Highlight;
textColor = SystemBrushes.HighlightText;
}
else
{
backgroundColor = SystemBrushes.Window;
textColor = SystemBrushes.WindowText;
}
if (item == "Preferred" || item == "Other")
{
font = new Font(font, FontStyle.Bold);
backgroundColor = SystemBrushes.Window;
textColor = SystemBrushes.WindowText;
}
if (item != "Select" && item != "Preferred" && item != "Other")
e.Graphics.DrawString(item, font, textColor, new Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height));
else
e.Graphics.DrawString(item, font, textColor, e.Bounds);
}
}
}
}
的項目都正常顯示,但是下拉顯得格格不入,看起來彆扭。
另外,當我將鼠標懸停在下拉項目上時,它們似乎又被重新塗刷,這使得它們看起來更黑更模糊。我怎樣才能解決這個問題?謝謝。
爲什麼使用'if-else'來繪製字符串的方式不同(使用不同的文本邊界),實際上,應該從'e.Bounds'中仔細地提取/計算文本邊界。 –
擺脫你的for ...循環。 DrawItem是繪製「一個」項目。 – LarsTech
@LarsTech我刪除了for循環,現在項目正確顯示。但是,當我將鼠標懸停在組合框中的項目上時,它們似乎再次被塗刷,導致它們看起來模糊和變暗。 – user3007740