2013-06-20 6 views
0

기본적으로 내 질문은 기본적으로 WinForms의 ComboBox 용 DrawItem을 구현하고 Text 속성을 변경하며 왜 멈출 수 있습니까? 내 콤보 상자의 OwnerDraw DrawItem 이벤트도 Text 속성 값을 변경합니다.

내하는 OwnerDraw 이벤트 "도"항목 [] 컨텍스트에 대한

(즉, 아래의 DrawItem 이벤트에서 구현)의 모든 항목과 동일한 논리로 설정됩니다 Text 속성을 제외하고 완벽하게 작동하기 때문에

, 나는 URL의의를 보여 목록,하지만 일부는 너무 오래 나는 기본적으로 그들을 잘라하고 텍스트를 넣어 "..."마지막에 - 더 읽기 쉽게. DataSource를 설정하여 "DisplayUrl"클래스의 속성 하나를 렌더링하지만 실제 값으로 다른 "Url"을 사용합니다. 어떻게 든 DrawItem 이벤트도 있기 때문에도이 코드를 실행 한 후 "텍스트"속성을 초래되어 일부 코드의 끝에서 (아래 myURL이)

, 내가 명시 적으로 설정 cmbUrl.Text = "전체 텍스트"

그러나 일단 DrawItem 이벤트가 끝나면 Text 속성은 Item [0]과 동일하게 설정됩니다. 텍스트와 즉 잘려 -에서 그대로 "FULL T ..."

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', 이것은'Url'과'라는 최소한 2 개 속성이 DisplayUrl' 이렇게 무엇인가' DisplayMember' 귀하의 콤보 박스? –

+0

DisplayMember = DisplayUrl ...이 텍스트 속성을 바인딩 할 것 같습니다? – 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가 ListItem뿐만 아니라 Text 속성에도 적용된다는 것을 알지 못했습니다. – PandaWood