Событие OwnerDraw DrawItem в моем комбинированном окне также изменяет значение свойства Text.

Мой вопрос в основном, реализует ли DrawItem для моего ComboBox в WinForms, изменить мое свойство Text, почему и я могу это остановить?

Поскольку мое событие OwnerDraw работает отлично, за исключением того, что свойство Text "также" получает ту же логику, что и все элементы в Items[] (т.е. реализовано в событии DrawItem ниже)

Для контекста я показываю URL-адреса в списке, но некоторые из них настолько длинные, что я в основном их нарезаю и помещаю текст "..." в конце, чтобы сделать его более читабельным. Я установил DataSource так, чтобы он отображал одно свойство моего класса "DisplayUrl", но использовал другое "Url" для фактического значения. (MyUrl ниже)

В конце некоторого кода я явно устанавливаю cmbUrl.Text = "THE FULL TEXT"

Но каким-то образом событие DrawItem также влияет на свойство "Текст", потому что даже после запуска этого кода, после завершения события 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 ответ

Решение

Я думаю, что вы хотите показать свой полный текст в поле со списком и просто хотите показать краткий текст в раскрывающемся списке элементов, поэтому решение может быть следующим:

private void cmbUrl_DropDown(object sender, EventArgs e){
    cmbUrl.DisplayMember = "DisplayUrl";
}
private void cmbUrl_DropDownClosed(object sender, EventArgs e){
    cmbUrl.DisplayMember = "Url";        
}
Другие вопросы по тегам