我的问题基本上是,在 WinForms 中为我的 ComboBox 实现 DrawItem,更改我的 Text 属性,为什么我可以停止它?
因为我的 OwnerDraw 事件完美运行,除了 Text 属性“也”被设置为与 Items[] 中的所有项目相同的逻辑(即在下面的 DrawItem 事件中实现)
就上下文而言,我在列表中显示了 URL,但有些太长了,我基本上将它们切掉并将文本“...”放在最后 - 使其更具可读性。我设置了 DataSource,以便它呈现我的类“DisplayUrl”的一个属性,但使用另一个“Url”作为实际值。(下面的MyUrl)
在一些代码的末尾,我明确设置 cmbUrl.Text = "THE FULL TEXT"
但不知何故,DrawItem 事件也影响了“Text”属性,因为即使在运行此代码之后,一旦 DrawItem 事件完成,我的 Text 属性设置为与 Item[0] 相同。即文本被剪掉 - 如“完整的......”
void cmbUrl_DrawItem(object sender, DrawItemEventArgs e)
{
var text = ((MyUrl)((ComboBox)sender).Items[e.Index]).DisplayUrl;
var brush = text.Contains("bla) ? Brushes.DarkGreen : Brushes.Black;
// Fill in the background
e.Graphics.FillRectangle(new SolidBrush(e.BackColor), e.Bounds);
if (e.Index < 0) return;
// Work out where every thing goes
int nX = e.Bounds.Left;
int nY = e.Bounds.Top;
const int nMarg = 2;
int nH = e.Bounds.Height - (2 * nMarg);
// Draw the Colour Gymph
var penFore = new Pen(e.ForeColor);
var rectGymph = new Rectangle(nX + nMarg, nY + nMarg, nH, nH);
e.Graphics.FillRectangle(brush, rectGymph);
e.Graphics.DrawRectangle(penFore, rectGymph);
var fullWidth = nX + nH + (2 * nMarg);
e.Graphics.DrawString(text, e.Font, brush, fullWidth, e.Bounds.Top);
}