2013-06-20 6 views
0

Мой вопрос в основном, реализует DrawItem для моего ComboBox в WinForms, меняет свойство Text, почему и я могу его остановить?Событие OwnerDraw DrawItem в моей combobox также меняет значение свойства Text

Потому что мое событие OwnerDraw работает отлично, за исключением имущества Текста «и» получает набор ту же логику, как и все элементы в пунктах [] (то есть, реализованных в DrawItem случае ниже)

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

В конце некоторого кода, я явно установить cmbUrl.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); 
} 
+0

Я могу видеть, что ваш выпадающий 'Item' является тип' MyUrl', это имеет, по крайней мере, 2 свойства, называемые '' Url' и DisplayUrl' так, что это ' DisplayMember' вашего сообщения? –

+0

DisplayMember = DisplayUrl ... так что это, похоже, также связывает свойство Text? – PandaWood

+0

, потому что вы установили 'DisplayMember =" DisplayUrl "', ваш comboBox всегда показывает, что в 'DisplayUrl', и все мы знаем, что оно имеет некоторое значение, например' 'http: // abcd ... '' Вы должны изменить 'DisplayMember 'в зависимости от того, выпало ли ваше поле со списком или нет. –

ответ

1

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

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

Спасибо, вот и все. Я не понял, что DataSource применяется к свойству Text, а также к ListItems. – PandaWood