我的组合框上的OwnerDraw DrawItem事件也会更改Text属性值

时间:2013-06-20 01:51:50

标签: c# winforms combobox ownerdrawn ondrawitem

我的问题基本上是,在WinForms中为我的ComboBox实现DrawItem,更改我的Text属性,为什么我可以阻止它?

因为我的OwnerDraw事件工作正常,但Text属性“also”被设置为与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);
}

1 个答案:

答案 0 :(得分:1)

我想你想在你的组合框中显示完整的文本,只想在项目下拉列表中显示短文,所以解决方案可能就是这样:

private void cmbUrl_DropDown(object sender, EventArgs e){
    cmbUrl.DisplayMember = "DisplayUrl";
}
private void cmbUrl_DropDownClosed(object sender, EventArgs e){
    cmbUrl.DisplayMember = "Url";        
}